3

is.seekg(0)と入力すると、ストリームの先頭に移動します。ただし、is.seekg(ios :: end)と入力すると、2番目の文字に移動します。なぜそれが起こるのですか。これについての私の誤解は、ストリームがどのように機能するかについての根本的な理解の欠如に根ざしていると思います。定数ios::endを提供すると、そのストリームの最後に移動すると思います。しかし、それはあなたを1文字前進させるように見えます。

  cin.seekg(0, ios::end);
  int length = cin.tellg();
  cout << length << endl;

  cin.seekg(0);

  cout << cin.tellg();

<「123456789」を含むファイルを入力すると

出力は100です

今私がこれを行う場合:

  cin.seekg(ios::end);
  int length = cin.tellg();
  cout << length << endl;

出力は2です

何故ですか?

4

3 に答える 3

3

このコードは偶然に機能します

cin.seekg(ios::end);
int length = cin.tellg();
cout << length << endl; 

endは から取得されるenum seekdir {beg, cur, end};ため、ios::endたまたま値 を持つ整数に変換可能です2

seekgの 1 つのオーバーロードへのパラメーターが整数であるため、呼び出しが に変わるのは残念ですcin.seekg(2)。技術的には有効なコードですが、これは間違いなくあなたが望むものではありません。

于 2012-07-30T09:15:19.330 に答える
2

std::ios_base::seekdirtypeの何かを type に変換し、引数を 1 つだけ取るstd::istream::pos_typeバージョンの を呼び出します。seekgそのバージョンのseekgは、ポインターを相対位置ではなく絶対位置に移動します。

ios::end絶対位置ではなく、相対オフセットに使用される論理位置です。

于 2012-07-30T03:26:53.467 に答える
1

STDIN がシーク可能であることに依存することはできません。これは、明らかにシークできないパイプなど、さまざまなソースから発生する可能性があるためです。STDINがファイルストリームに結び付けられているため、ファイルをリダイレクトしたときにうまくいった可能性があります。信頼できるかどうかはわかりませんが、私の推測です。STDINでシークすることさえ考えたことはありません。たとえそうでなくても、私はいつもそれをパイプだと考えています。STDOUT と同じです。何かを出力してから、その出力をバックトラックして「上書き」しようとはしません。標準ストリームをシークする必要がある場合は、おそらくアプローチを再考する必要があります。

于 2012-07-30T03:27:27.267 に答える