为什么输入流对象在读完文件后失败
Why input stream object fails after reading file to the end?
代码如下:它给出如下所示的EXACT输出意味着它正在读取文件。但它也显示了fails
你可以看到它意味着fin.fails()
是true
。我想知道为什么这是真的,虽然我成功地读取了文件。
#include<fstream>
#include<iostream>
using namespace std;
int main()
{ ifstream fin;
fin.open("pro.txt");
char ch;
int data;
while(!fin.eof())//!(fin >> ch).eof()
{
fin.get(ch);
cout<<ch;
if(fin.fail()) {
cout<<"fails";
break;
}
}
fin.clear();
fin.seekg(0);
int pos=(int)fin.tellg();
cout<<"n this is :"<<pos;
fin.close();
return 0;
}
Output is :
this is my name
fails
this is 0
Contents of pro.txt:
this is my name
不知道为什么会这样!
仍然不能找到为什么fin.fails()
是真的,因为我认为没有人愿意但我发现阅读空白和文件没有使fin.fails()
= true
。只需将while(!fin.eof())
替换为while(fin.get(ch))
,并删除while body中存在的fin.get(ch)
->这就是为什么我的输出为每次读取跳过一个字符的原因。
问题如下:使用get
读取文件中的最后一个字符将而不是设置eofbit
,因此在while
条件中调用fin.eof()
在您读取循环体内文件的最后一个字符后仍然返回false
。然后在读取最后一个字符之后的迭代中,尝试读取循环体中的另一个字符,即使没有字符可读了。这将根据get
的规范设置eofbit
和为failbit
。
TL;DR:读取文件的末尾应该设置failbit
.
相关文章:
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- 成功的生成文件失败,在 CLion 中出现"identical" CMake
- 谷歌测试读写同一文件失败
- 复制文件成功,移动文件失败,参数相同 - C++
- 驱动器号上的查找文件失败,但在路径上传递
- C++使用命令行输入 txt 文件,但打开文件失败
- 编译 C++ 文件失败,因为找不到"ssize_t"的定义
- 如何在使用 CFileDialog 打开文件失败时捕获异常
- Clang 3.8 使文件失败
- 查找下一个文件失败,出现空格字符
- 十六进制数组 cout 到文本文件失败
- 使用 WriteFile 将 RegQueryValueEx 值写入文件失败
- FSCTL_GET_RETRIEVAL_POINTERS对于小文件失败
- C++ 在使用ifstream时,在Apache下运行的CGI文件失败
- 生成文件失败,错误没有规则来设定目标
- 使用创建文件打开网络文件失败,并显示FILE_NOT_FOUND
- cmake - 单元测试++链接单元测试二进制文件失败
- 通过终端和编译创建项目文件失败,但通过Qt Creator IDE工作正常
- 在Swift代码中调用C++函数时读取文件失败
- Nacl:为***打开文件失败-5