为什么seekg功能不起作用?

时间:2013-02-07 13:53:23

标签: c++ file get seekg

以下是代码:

#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'?为什么不搜索函数将文件指针移回一个字节?

2 个答案:

答案 0 :(得分:3)

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

如果你想在最后一个字符读取之前移动到字符,你需要搜索-2,而不是-1。

答案 1 :(得分:2)

如果您执行此操作,它将起作用:fin.seekg(-sizeof(char)-1,ios::cur);

注意:寻找文本文件中的任意位置是未定义的行为。见这里:How to read the 6th character from the end of the file - ifstream?