- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读了一个question在 Stack Overflow 上,istream file
的 eofbit 已设置,但 failbit 未设置。在这种情况下,file 为真且 file.eof() 为真但 file.good() 为假。例如,文件大小恰好为一个字节:
ifstream file("one.txt");
assert( file.is_open() );
for( int i = 0; i < 2; ++i )
{
char chars[255] = {0};
file.getline(chars, 2);
//file.read( chars, 2 );
cout << "file: " << !!file << endl;
cout << "good: " << file.good() << endl;
cout << "eof: " << file.eof() << endl;
cout << "fail: " << file.fail() << endl;
cout << "bad: " << file.bad() << endl;
cout << endl;
}
这是输出:
file: 1
good: 0
eof: 1
fail: 0
bad: 0
file: 0
good: 0
eof: 1
fail: 1
bad: 0
如果我注释掉 getline() 并改为使用 read(),我会得到:
file: 0
good: 0
eof: 1
fail: 1
bad: 0
file: 0
good: 0
eof: 1
fail: 1
bad: 0
在这两种情况下,我都在循环的第一次迭代中读取了文件末尾。为什么一个 EOF 失败而另一个失败?另一个线程中的答案是“每当您遇到文件末尾而没有尝试读取它的后面时”。读后面呢?这是什么意思?
最佳答案
eofbit
由 getline
方法设置,如果它停止读取是因为它到达流(文件)的末尾,而不是通过查找分隔符。 getline
在那种情况下没有设置failbit
,这是合乎逻辑的,因为它没有失败:它读取了一些数据。
一旦设置了eofbit
,对该流的下一个读取操作将设置failbit
,因为内部哨兵函数,几乎在每个输入开始时调用操作,如果设置了 eofbit
,将设置 failbit
。
一般来说,eofbit
“表示一个输入操作到达了输入序列的末尾”,而failbit
“表示一个输入操作未能读取预期字符”(两个引号均来自 C++ 标准,[ios.types]
部分;§27.5.3.1,表 124,在我手头的最新草案中。)作为 getline
示例表明,输入操作很有可能读取输入序列的末尾,同时仍在读取某些内容。
另一种不太正式的——因此可能不正确的——看待这个问题的方式是,如果读取操作到达文件末尾,则设置 eofbit
,而 failbit
如果读取操作无法读取所需的最小字符数,则设置。 getline
和 read
调用中的 2
含义不同;在getline
中,为输入操作的最大字符数(最小为1);在 read
的情况下,它是精确的字符数。
关于C++ istream EOF 不保证 failbit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22031398/
对于我的一项作业,我被告知使用 cin.clear(ios_base::failbit) 来设置 failbit。我想知道,cin.clear(ios_base::failbit) 和 cin.set
创建一个文件并用零填充它: dd if=/dev/zero of=/tmp/zeroes count=1 编写这个小程序来提取它在文件中遇到的第一个无符号整数。 #include #include
我正在尝试编写一个程序,要求使用 cin.getline() 输入一个 char 数组,如果给定的输入大于数组长度,数组将被扩展。 我使用 cin.failbit 来查看用户的输入是否太长。但一切都不
#include #include #include using namespace std; int main(){ istringstream input("1234");
这个最小的程序使用 boost::program_options 来解析 stringstream。奇怪的是,在解析之后,流不再处于“良好”状态,并且设置了 failbit 和 eofbit。 #in
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我读了一个question在 Stack Overflow 上,istream file 的 eofbit 已设置,但 failbit 未设置。在这种情况下,file 为真且 file.eof() 为
我无法读取二进制文件。它似乎没有读到最后: // get file size ifs.open (inFile.c_str(), ios::binary | ios::ate); cout > c;
设置故障位后:当我先调用 cin.clear() 然后调用 cin.ignore() 时,程序是正确的。当我先调用 cin.ignore() 然后调用 cin.clear() 时,忽略似乎不起作用,为
是否可以使用 getline() 读取有效文件而不设置 failbit?我想使用 failbit 以便在输入文件不可读时生成异常。 以下代码总是在最后一行输出 basic_ios::clear - 即
对于以下代码: #include #include using namespace std; int main() { istringstream iss("a"); iss.ge
我正在创建一个原始类型包装器,它可以使用 boost::lexical_cast 从字符串设置它的值。它工作正常,但由于某种原因 std::istream 提取运算符设置了 failbit。以下程序打
我正在尝试使用 ios 包读取 csv 文件,但没有读取任何内容。我检查了文件流中的 failbit,由于某种原因,它在我实际读取任何内容之前就被立即设置了。这是我的代码: #include #in
我试图使用 std::ifstream 将整个文件读入缓冲区,但没有明显的原因失败,所以我构建了一个最小的代码示例来演示问题: std::vector vec; vec.resize(1000); s
我正在尝试使用 c++ std::ifstream 类将二进制文件准备成一组变量。 以下示例有效: std::ifstream inFile; inFile.open("example.bin");
我知道这种行为的起源,因为它已经在 SO 的多个帖子中得到了很好的解释,一些值得注意的例子是: Why is iostream::eof inside a loop condition conside
是否应该使用 std::ws 操纵器从流中提取失败位?在以下代码中,Clang 编译的(在 Xcode 4.5.1 中)程序最终断言失败。显然 s >> std::ws 在 EOF 导致失败。然而 G
当我将包含 long double 的 string 转换为 float 或 double 时,std: :istringstream 不会在 QNX 中引发 failbit 标志。 下面是演示代码:
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: Failing to read file loaded with ifstream 以下文件的输出是:001
我看到了 istream::seekg 的奇怪行为。具体来说,它似乎当我寻找明显远离文件末尾的点时,不要设置故障位。 根据我在文档中了解到的信息,应该设置故障位,但实际上并没有。 谁能解释这种行为?相
我是一名优秀的程序员,十分优秀!