0

似乎总是对我造成问题的事情应该没问题。我不明白。:/

所以我试图确保我了解如何操作文本文件。我有两个文件,“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 个数字之和为 8

后 3 个数字之和为 14

再一次,前 3 个数字的总和是 14

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

4

3 回答 3

4

正如 Bo Persson 所说,这可能是因为您的输入遇到了文件结尾;它不应该,因为在 C++ 中,文本文件被定义为由 a 终止'\n',但实际上,如果你在 Windows 下工作,很多生成文件的方法都会省略这个'\n'final——尽管它是正式要求的, 实际考虑将意味着即使'\n'缺少决赛,您也将确保它有效。而且我想不出任何其他原因为什么 seekg' 不起作用。 inStream.seekg( 0 )当然,这是未定义的行为,但在实践中,它几乎可以在任何地方工作。 如果并且是 恕我直言,比第一种形式更可取,inStream.seekg( 0, ios::beg )则保证可以工作。(单参数形式 inStream.good()seekg通常仅与 a 的结果一起tellg用作参数。)当然,它仅在实际输入源支持搜索时才有效:如果您从键盘或管道读取(但大概"infile.txt"是两者都不)。

通常,您应该inStream在每次读取后检查状态,然后再使用结果。但是,如果唯一的问题是文件不以 结尾,那么即使您遇到文件结尾,最终读取后'\n'状态也可能会是 OK ( )。!fail()在这种情况下,无论如何你都需要clear()

请注意,上述注释适用于 C++-03 和先例。C++11 更改了 的单参数形式的规范,并要求它在其他任何事情之前seekg重置。(为什么这种变化只针对 的单参数形式 ,而不是两个参数形式?监督?)eofbit seekg

于 2013-04-05T08:34:33.743 回答
2

第二个输入到达流的文件结尾。该状态一直存在,直到您调用inStream.clear()清除其状态(除了搜索)。

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

于 2013-04-05T07:27:09.407 回答
1

尝试:

inStream.seekg(0, ios_base::beg);
于 2013-04-05T07:24:59.203 回答