0

コードは次のとおりです。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(int argc, char *argv[])
{
  string infile(argv[1]);
  ifstream fin(infile.data());

  string var_name;
  char ch = fin.get();
  cout << ch << endl;

  ch = fin.get();
  cout << ch << endl;

  ch = fin.get();
  cout << ch << endl;

  cout << "pos: " << fin.tellg() << endl;
  fin.seekg(-sizeof(char),ios::cur);
  cout << "pos: " << fin.tellg() << endl;

  ch = fin.get();
  cout << ch << endl;

  return 0;
}

ファイルの内容は単なる文字列です。

<
?
x
m

出力は次のとおりです。

<\n
?\n
x\n
pos: 3\n
pos: 2
x

印刷された最後の文字がまだ「x」であるのはなぜですか?seekg関数がファイルポインタを1バイト戻しないのはなぜですか?

4

2 に答える 2

4

xを読み取った後のファイルポインタの位置は3でしたが、x自体は位置2にあります(最初の文字が位置0にあるため)。1文字戻ると、ファイルポインタが最後に読み取った文字に配置されます。これは、まさにここで起こっていることです。

最後に読み取った文字の直前の文字に移動する場合は、-1ではなく-2でシークする必要があります。

于 2013-02-07T13:59:07.860 に答える
2

これを行うとうまくいきます:fin.seekg(-sizeof(char)-1,ios::cur);

注: テキスト ファイル内の任意の場所へのシークは、未定義の動作です。ここを参照してください:ファイルの末尾から 6 番目の文字を読み取る方法 - ifstream?

于 2013-02-07T14:03:01.247 に答える