ファイルの最初の数行を読み取ってそのタイプを判別し、次にファイルを閉じて再度開き、正しいインタープリターを使用してファイル全体を再度読み取ることができる関数(レガシー)があります。要点は次のとおりです。
void readFile(const char *filename) {
ifstream is(filename);
Filetype ft = determineFileType(is);
is.close();
is.open(filename);
parseFile(is, ft);
}
すでに開いているストリームで機能する同様の関数が必要でした。ostream &
--の代わりに取る新しい関数を作成しましたchar *filename
-基本的にこれ:
void readFile(istream &is) {
std::ios::streampos pos = is.tellg();
Filetype ft = determineFileType(is);
is.seekg(pos);
parseFile(is, ft);
}
istream
が実際にastringstream
またはanの場合は機能するようfstream
ですが、運が良かっただけなのかと思います。私もseekg
-ingで小さなテストをしstd::cin
ました、そしてそれは私を驚かせました。
だから私の質問:あなたはどのような種類のストリームを使用することが許可されてseekg
いますか?いつ失敗しますか?仕様の参照は素晴らしいでしょう-私は調べましたが、、、、の内容はseekg
まったくpubseekpos
役に立ちませんでした。seekpos
seekoff
(以下のように)新しい機能の観点から元の関数を再実装したいのですが、それが安全かどうかはわかりません。
void readFile(const char *filename) {
ifstream is(filename);
readFile(is);
is.close();
}