1

ファイルの最初の数行を読み取ってそのタイプを判別し、次にファイルを閉じて再度開き、正しいインタープリターを使用してファイル全体を再度読み取ることができる関数(レガシー)があります。要点は次のとおりです。

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役に立ちませんでした。seekposseekoff

(以下のように)新しい機能の観点から元の関数を再実装したいのですが、それが安全かどうかはわかりません。

void readFile(const char *filename) {
  ifstream is(filename);
  readFile(is);
  is.close();
}
4

1 に答える 1

1

人が与えることができる唯一の本当の答えは、それが機能する場所で機能するということです。の場合、std::stringbufどこでも機能するはずです。の場合、 std::filebufそれが機能するかどうかはシステムに依存します。通常、が実際のファイルで開かれている場合filebufは機能しますが、キーボードや名前付きパイプなど、他の多くの種類の入力では通常失敗します(システムがエラーを報告しない場合は、おそらくサイレントに)。

より堅牢な解決策は、最初の入力をキャッシュし、それをキャッシュから再読み取りすることです。

于 2011-09-19T18:18:33.323 に答える