C++用getline(fin,str)读取文本文件的ifstream对象fin每一行,哪种写法较好,结果正确?

ooolinux 2020-08-29 08:02:26
C++用getline(fin,str)读取文本文件的ifstream对象fin每一行,哪种写法较好,结果正确?
ifstream fin("a.txt");
string str;

1、
while(!fin.eof())
{
getline(fin,str);
cout<<str<<endl;
}
2、
getline(fin,str);
while(!fin.eof())
{
cout<<str<<endl;
getline(fin,str);
}
3、
while(getline(fin,str))
{
cout<<str<<endl;
}
或者有没有别的写法?
...全文
947 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2020-08-30
  • 打赏
  • 举报
回复
我见过while(fin>>a>>b)这种连着写也可以,还是比较方便。但是我最近看一本国产的STL基础第二版,代码清一色都是类似我5楼的代码和一楼第一种写法,感觉eof不那么靠谱的。
ooolinux 2020-08-30
  • 打赏
  • 举报
回复
引用 8 楼 ooolinux的回复:
[quote=引用 7 楼 早打大打打核战争的回复:] while(fin>>s)
{
cout<<s<<endl;
if (fin.eof()) break;
}
这样写,最后一行有没有换行/回车都可以正确输出
如果while这样写,if那行可以不要。[/quote] if不要结果貌似也正确。
ooolinux 2020-08-30
  • 打赏
  • 举报
回复
引用 7 楼 早打大打打核战争的回复:
while(fin>>s)
{
cout<<s<<endl;
if (fin.eof()) break;
}
这样写,最后一行有没有换行/回车都可以正确输出
如果while这样写,if那行可以不要。
  • 打赏
  • 举报
回复
while(fin>>s)
{
cout<<s<<endl;
if (fin.eof()) break;
}
这样写,最后一行有没有换行/回车都可以正确输出
ooolinux 2020-08-30
  • 打赏
  • 举报
回复
老概有没有试下我5楼代码的问题?
ooolinux 2020-08-29
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
其它写法还有,比如while true 循环,读异常或eof就break等等
不过通常用法就是你列出的 3
而你列出的2有可能不正确,一般不用


引用 2 楼 早打大打打核战争 的回复:
2的话如果最后一行没有换行/回车,直接文件结束,就会少读一行

我印象中记得,最后一行如果有数据读出的话,是不会eof()的,然后已经结束的文件再次读取,才会eof()?
我以前学C语言时记得EOF字符是这样。
  • 打赏
  • 举报
回复
2的话如果最后一行没有换行/回车,直接文件结束,就会少读一行
qybao 2020-08-29
  • 打赏
  • 举报
回复
其它写法还有,比如while true 循环,读异常或eof就break等等 不过通常用法就是你列出的 3 而你列出的2有可能不正确,一般不用
ooolinux 2020-08-29
  • 打赏
  • 举报
回复
引用 4 楼 早打大打打核战争 的回复:
确实是读了最后一行(即便没有换行/回车),但是2的逻辑最后一行如果没有换行/回车的话是没有输出的

我用Code::Blocks试了一下,1的写法getline貌似没错。
类似的写法,以下代码貌似有问题:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
ifstream fin("b.txt"); //b.txt行尾有换行:abc hello world
if(!fin.is_open())
{
cout<<"文件不存在"<<endl;
return 1;
}
string s;
// while(fin>>s)
while(!fin.eof())
{
fin>>s;
cout<<s<<endl;
}
fin.close();
return 0;
}
  • 打赏
  • 举报
回复
确实是读了最后一行(即便没有换行/回车),但是2的逻辑最后一行如果没有换行/回车的话是没有输出的

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧