关于c ++在阅读eof方面的操作方式,我得到了相互矛盾的建议。 第一组人说当标记读取经过eof区域时,它到达eof并停止,而另一组人说它必须处于准确的位置,以便将其处理为到达eof。为了使这个更清楚,让我粘贴2块代码。
在这段代码中,我正在从文件numbers.txt中读取数字1。它们没有语法错误,我唯一没有粘贴的是打开文件的代码。
while (!sample.eof())
{
char ch;
sample.get(ch);
sample.seekp(-1L, ios::cur);
sample >> initialnumber;
sample.seekp(2L, ios::cur);
cout << "OK";
}
在这个程序中,我正在读取数字1向后移动一个空间,使其从开始处理它然后向前移动两个空格。这个输出只能写一次。
#include < iostream>
#include < fstream>
#include< string>
using namespace std;
string conversion(int);
int conversion2(string);
int main()
{
string initialnumber;
fstream SAMPLE("numbers.txt", ios::in | ios::out);
ofstream sample2("numbers2.txt");
if (sample && sample2)
{
int number2;
string roman;
int number;
char ch;
while (!sample.eof()) {
sample.get(ch);
if (ch != '1' && ch != '2' && ch != '3' && ch != '4' && ch != '5' && ch != '6'
&& ch != '7' && ch != '8' && ch != '9') {
SAMPLE.seekg(-1L, ios::cur);
sample >> roman;
sample.seekg(2L, ios::cur);
sample2 << roman << " " << conversion2(roman) << endl;
int L = sample.tellp();
cout << L;
}
else {
sample.seekg(-1L, ios::cur);
sample >> number2;
sample2 << conversion(number2) << " " << number2 << endl;
sample.seekg(2L, ios::cur);
}
}
}
else
{
cout << "fail";
}
sample.close();
sample2.close();
}
这里重复无数次,不应该重复它,这意味着它永远不会到达eof。
请帮助我理解这两个程序的逻辑。
答案 0 :(得分:0)
从C ++ 11开始
Before doing anything else, seekg clears eofbit.
http://en.cppreference.com/w/cpp/io/basic_istream/seekg
由于seekg
始终是您在检查.eof()
之前调用的最后一件事,因此永远不会检测到它。当读取操作到达文件末尾时,将设置eofbit
。因此,阅读必须是你为它工作的最后一件事。