ifstream文件尾最后一行读两次
来源:互联网 发布:linux中man的用法 编辑:程序博客网 时间:2024/05/20 22:30
只是想简单地从文件中读入字符串,却发觉最后一个字符串读了两次。
代码如下:
ifstream input_positive("train-pos.lst");
string input_str;
vector<string> positive_img_name;
while(input_positive)
{
getline(input_positive,input_str);
positive_img_name.push_back(input_str);
}
在网上查看了别人出现的相关错误,有的人说应该读取之后判断eof。
修改代码为:
ifstream input_positive("train-pos.lst");
string input_str;
vector<string> positive_img_name;
while(input_positive)
{
getline(input_positive,input_str);
if(input_positive.eof())
break;
positive_img_name.push_back(input_str);
}
这下最后一行确实只读了一次了,不过我发觉第一行却没有读进去。不知道怎么回事。
再次修改代码为:
ifstream input_positive("train-pos.lst");
string input_str;
vector<string> positive_img_name;
while(input_positive)
{
getline(input_positive,input_str);
if(input_positive.fail())
break;
positive_img_name.push_back(input_str);
}
这下子终于没有问题了。
fail() 判断最后的一次读写操作是否成功;
eof() 判断是否读到了流末尾;
bad() 是否遇到了致命错误(如文件打不开);
good() 这三个错误都没遇到;
所以eof()不能够用来在循环中判断文件是否读到最末尾,容易出现问题。
eof()只有在你尝试读取文件结尾之后才会返回true,也就是说它的判断是滞后的。
最后一次读到文件末尾时,eofbit标志是false,所以再次读入,此时读取失败,eofbit
标志置为true,此时再次调用eof()才返回true,但是这里却把最后一行数据再次压入vector中。
标准流类中,有四个比较重要的bit,分别是goodbit、eofbit。
badbit表示在输入序列中遇到完整性缺失(比如在读取文件时遇到一个不可恢复的读故障)。
eofbit表示读取到输入序列的末尾。
failbit表示输入操作未读取到期望的符号,或输出操作未产生需要的符号。
goodbit为0。
所以,goodbit可以使用good()成员函数查询,查询流是否没有错误;eofbit可以用eof()成员函数查询,查询输入流是否读到输入序列结尾;failbit可以用fail()成员函数来查询,查询上一次流输入或输出操作是否成功(还可以用operator void*()和bool operator ! ()成员函数查询);badbit可以使用bad()成员函数查询,查询流是否遇到致命错误。
- ifstream文件尾最后一行读两次
- ifstream 最后一行多读了一次
- ifstream 最后一行多读了一次
- C++fstream,ifstream和outstream读取文件最后一行注意
- LINUX下使用风格特色读去文件最后一行两次
- 为什么fgets()会读取文件最后一行两次?
- c++文件读取最后一行读取两次的问题
- ifstream中使用eof最后一个字符输出两次
- 高效读取文件最后一行
- python 读取文件最后一行
- C++ 读取文件最后一行
- php读取文件最后一行
- 读取文件最后一行数据
- nodejs读取文件最后一行
- python 倒读 一个文件,从最后一行往前读
- 读文件最后一行数据重复出现解决办法
- Java实现从文件最后一行开始读
- 如何输出文件的最后一行
- 主项定理Master Method
- 自定义注解过滤JUnit测试类
- 总线设备模型-kobject .
- LeetCode | Same Tree
- android_1
- ifstream文件尾最后一行读两次
- 在编译内核的最后阶段出现sdhci_esdhc_imx_pdata未定义的错误
- linux系统编译C++程序时头文件和库文件搜索路径
- 输入四个点的坐标,求证四个点是不是一个矩形
- mips64高精度时钟引起ktime_get时间不准,导致饿狗故障原因分析
- Codeforce 338 C. Divisor Tree(爆搜,3级)
- 九度1008最短路
- OM所经历的表
- 求两个或N个数的最大公约数和最小公倍数