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 函数不将文件指针向后移动一个字节?

4

2 回答 2

4

读取 x后文件指针的位置为 3 ,但 x 本身位于位置 2(因为第一个字符位于位置 0)。向后移动 1 个字符会将文件指针放在它最近读取的字符处,这正是这里发生的情况。

如果你想移动到最后一个字符读取之前的那个字符,你需要通过-2而不是-1来寻找。

于 2013-02-07T13:59:07.860 回答
2

如果您这样做,它将起作用:fin.seekg(-sizeof(char)-1,ios::cur);

注意:寻找文本文件中的任意位置是未定义的行为。请参见此处:如何从文件末尾读取第 6 个字符 - ifstream?

于 2013-02-07T14:03:01.247 回答