似乎总是那些对我来说应该没问题的事情。我不明白。 :/
所以我试图确保我理解如何操作文本文件。我有两个文件,“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
它又回来了,但并不像我希望的那样。知道为什么会这样吗?为什么我的前三次尝试都失败了?
答案 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);