- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道函数“eof”(cpp)只有在错误地尝试从文件中读取后(而不是当我到达文件末尾时)才返回“True”
因此,如果我们想将所有文件从 1 移动到另一个,我们必须这样做
infile.get(c);
while ( !infile.eof() )
{
outfile << c;
infile.get(c);
}
不是
while ( !infile.eof() )
{
infile.get(c);
outfile <<c;
}
因为如果我们采用第二种方式,最后一个字符将复制 2 次
但在另一个程序上它不是这样工作的
我创建文件 grades.txt 并在上面写上“dani”
代码如下:
ifstream inGrade("grades.txt");
ofstream outRoster("roster.txt");
int tmpGrade;
inGrade >> tmpGrade;
while (!inGrade.eof() )
{
outRoster << tmpGrade <<endl ;
inGrade >> tmpGrade;
}
它创建“roster.txt”但不向其中复制任何内容。
但是如果我使用这段代码:
ifstream inGrade("grades.txt");
ofstream outRoster("roster.txt");
int tmpGrade;
while (!inGrade.eof() )
{
inGrade >> tmpGrade;
outRoster << tmpGrade <<endl ;
}
它将创建 roster.txt 并将“dani”复制到那里
为什么???为什么在这个例子中 eof 在我们到达文件末尾时返回 false,而不是在错误尝试从文件中读取之后返回 false。
最佳答案
I create file grades.txt and write on this "dani"
所有读取操作都应该失败,因为“dani”不能提取为整数。这会设置流的 failbit 但不会消耗任何字符,因此不会设置 eofbit。你的两个程序都应该陷入无限循环。
fix i not put dani i put "100"
好的,那么你不会得到无限循环:)我已经写了一个程序来演示这个问题:
istringstream input("100");
int foo;
cout << "Reading int succesfully" << endl;
input >> foo;
cout << "!input:\t" << boolalpha << !input << endl;
cout << "input.eof():\t" << boolalpha << input.eof() << " << pay attention" << endl << endl;
cout << "Attempting to read eof" << endl;
input >> foo;
cout << "!input:\t" << boolalpha << !input << endl;
cout << "input.eof():\t" << boolalpha << input.eof() << endl << endl;
input.clear();
input.str("c");
char c;
cout << "Reading char succesfully" << endl;
input >> c;
cout << "!input:\t" << boolalpha << !input << endl;
cout << "input.eof():\t" << boolalpha << input.eof() << " << pay attention" << endl << endl;
cout << "Attempting to read eof" << endl;
input >> c;
cout << "!input:\t" << boolalpha << !input << endl;
cout << "input.eof():\t" << boolalpha << input.eof() << endl << endl;
输出:
Reading int succesfully
!input: false
input.eof(): true << pay attention
Attempting to read eof
!input: true
input.eof(): true
Reading char succesfully
!input: false
input.eof(): false << pay attention
Attempting to read eof
!input: true
input.eof(): true
因此,eofbit 在读取单个字符时的行为与读取格式化输入(例如数字)时的行为不同。
因此,如果您想修改您的循环版本,使其对数字和字符的行为相同,您需要使用 bool 转换而不是 eof()
。此外,这将防止无效输入的无限循环。您可以改用 fail()
,但它不会检查 badbit,因此当您遇到 i/o 错误时它不会有预期的行为。
infile.get(c);
while (infile) // or !infile.fail() if you have infallible hardware
{
// use c
infile.get(c);
}
应该和
一样工作int tmpGrade;
inGrade >> tmpGrade;
while (inGrade)
{
// use tmpGrade
inGrade >> tmpGrade;
}
但是,您的方法会重复输入调用。您可以通过在循环条件中获取输入来避免这种情况:
while (inGrade >> tmpGrade)
{
// use tmpGrade
}
关于c++ - eof函数如何在cpp上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28628027/
我是一名优秀的程序员,十分优秀!