无法获取ios :: beg返回文件的开头

时间:2013-04-05 07:21:46

标签: c++ text file-io

似乎总是那些对我来说应该没问题的事情。我不明白。 :/

所以我试图确保我理解如何操作文本文件。我有两个文件,“infile.txt”和“outfile.txt”。 “infile.txt”中有六个数字,没有别的。这是我用来操作文件的代码。

#include<fstream>
using std::ifstream;
using std::ofstream;
using std::fstream;
using std::endl;
using std::ios;

int main()
{
ifstream inStream;
ofstream outStream;//create streams

inStream.open("infile.txt", ios::in | ios::out);
outStream.open("outfile.txt");//attach files

int first, second, third;
inStream >> first >> second >> third;
outStream << "The sum of the first 3 nums is " << (first+second+third) << endl;
//make two operations on the 6 numbers
inStream >> first >> second >> third;
outStream << "The sum of the second 3 nums is " << (first+second+third) << endl;

inStream.seekg(0); //4 different ways to force the program to go back to the beginning of the file
//2. inStream.seekg(0, ios::beg);
//3. inStream.seekg(0, inStream.beg);
//4. inStream.close(); inStream.open("infile.txt");
//I have tried all four of these lines and only #4 works. 
//There has got to be a more natural option than just 
//closing and reopening the file. Right?

inStream >> first >> second >> third;
outStream << "And again, the sum of the first 3 nums is " << (first+second+third) << endl;

inStream.close();
outStream.close();
return 0;
}

也许我不太清楚流是如何工作的,但我看到一些消息来源说seekg(0)应该将索引移回文件的开头。相反,这就是我从中得到的。

  

前3个num的总和为8

     

第二个3 nums的总和是14

     

同样,前3个num的总和是14

它又回来了,但并不像我希望的那样。知道为什么会这样吗?为什么我的前三次尝试都失败了?

3 个答案:

答案 0 :(得分:3)

正如Bo Persson所说,可能是因为你的输入有 遇到文件结束;它不应该,因为在C ++中,一个文本 文件被定义为由'\n'终止,但实际上 说来,如果你在Windows下工作,有很多方法 生成文件将省略此最终'\n' - 尽管它 正式要求,实际考虑将意味着 即使是最终的'\n',你也会确保它有效 失踪。我无法想到任何其他原因 seekg不起作用。当然,inStream.seekg( 0 )是 未定义的行为,但在实践中,它将起作用 到处。保证inStream.seekg( 0, ios::beg ) 工作如果 inStream.good(),并且是,恕我直言,优于 第一种形式。 (seekg的单个参数形式通常是 仅用于tellg作为参数的结果。)和 当然,它仅在实际输入源支持时才有效 寻求:如果你是从键盘上读书,它将无法工作 管道(但可能是"infile.txt"都不是)。

通常,您应该在每次之后检查inStream的状态 在使用结果之前阅读。但如果唯一的问题是那样的话 该文件不以'\n'结尾,可能是状态 在最终阅读之后,即使你已经,也可以(!fail()) 遇到文件结束。在这种情况下,您需要clear() 反正。

请注意,上述注释对C ++ - 03和先例有效。 C ++ 11改变了单个参数形式的规范 seekg的{​​{1}},并要求它在之前重置eofbit 其他。 (为什么这种改变仅适用于单个参数形式 seekg,而不是两个论证形式?监督?)

答案 1 :(得分:2)

第二个输入到达流的文件结尾。这种状态一直持续到你打电话给inStream.clear()来清除它的状态(除了寻找之外)。

使用符合C ++ 11的编译器,选项4也应该尽可能接近,重新打开现在将清除以前的状态。较旧的编译器可能不会这样做。

答案 2 :(得分:0)

尝试:

inStream.seekg(0, ios_base::beg);