ifstream按行输入 怎么最后一行输入了2次

ifstream按行输入 怎么最后一行输入了2次,第1张

fstream 中的 eofbit 标记是在尝试读取文件结尾时才设立的

读取完最后一个数据后,fstream 仍处于正常状态,所以下一次 while 判断不会跳出,再次 fin>>x 时,fstream 发现没有数据可读,胡虚源此时才会设立 failbit。但由于已进入循环,虽然未读数据,x 仍保留上次的值,所以就又一次 pushback 了。

解决誉裂方法改变循环条件裤态即可:

while(fin>>x){

l.push_back(x)

}

c++里面用file.eof()来控制循环的做法,是一个不好的行为。 因为它是一种后知后觉的方式, 也就是说如果文件没有打开,姿拆 或者文件个格式有问题, 比如尾部都多出个空格, 由于file.eof()只是检测标迹贺枣记, 而上述情况,标记没有被设置, 因此就会继续执行。

解决的方法有很多, 比如先读一下, while (getline(...)) {....} , 按你的情况, 其实应该在ReadGroup()里面作检测, 如果不愿意修改ReadGroup(), 有一个代价最小的做法:

//前提, 你的file是ifstrem的。

std:string line

while (file >>line)

{

file.push_back(line)

ReadGroup()

....

}

说实话, 对循环读这种方式, 尽量做到每次读多少个字节。 然后比较具体读出的字节数, 和期待值作比较, 就能发拍宏现问题。 即便要读到一个数据结构里面, C++的方式, 也应该封装到class里, 重载<<或>>。

当读到枝袭d(第一个字符)时,读取失败,输出bad data,try again.,然后你清除了错误标记,喊早但是文件流指针并没有移动,郑搭雀因此读到的始终是d这个字符。你应该加个cin.get()之类的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12226808.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存