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;
}
或者有没有别的写法?
...全文
891 10 打赏 收藏 转发到动态 举报
写回复
用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的逻辑最后一行如果没有换行/回车的话是没有输出的
相当不错的一个成绩管理系统 #include #include #include #include using namespace std; enum {SUBJECT=5};//一共五门 typedef struct { char subject[10];//科目名称 int score;//科目成绩 }markinfo; typedef struct studentnode { markinfo mark[SUBJECT]; int totalmark; char name[10];//学生姓名 studentnode * next; }studentnode; class student { studentnode * head; public: student(); int addstudent(); ~student(); int countmark(); int sortbymark(); int save(); int show(); int display(); int readfiletolist(); int searchbyname(); }; student::student() //用构造函数来初始化。 { head=new studentnode; head->next=NULL; } //1.输入学生姓名、成绩等数据,并保存在链表中。 int student::addstudent() { studentnode * p; int i; char check; system("cls"); cout<<"**********************"<totalmark=0; do { coutp->mark[i].score; } while(p->mark[i].score>100||p->mark[i].scoretotalmark=p->totalmark+p->mark[i].score; getchar(); } while(++i!=SUBJECT); if(head->next==NULL) { head->next=p;p->next=NULL; } else { p->next=head->next; head->next=p; } coutnext; cout<<"请输入保存的地址"<stream fout; fout.open(address,ios::app|ios::out); while(p) { fout<<"*"; foutnext; delete p; p=s; } delete head; } //3.按照总成绩大小对记录进行排序 int student::sortbymark() { studentnode *move1=head->next; studentnode *move2,*max,*pre1,*pre2,*maxpre,*s=move1; if(head->next==NULL) { cout<<"没有记录,请添加"next,max=move1) { for(pre2=move1,move2=move1->next;move2!=NULL;pre2=move2,move2=move2->next) if(move2->totalmark>max->totalmark) { maxpre=pre2; max=move2; } if(move1->next==max) //交换max和move1。 { pre1->next=max; move1->next=max->next; max->next=move1; move1=max; } else { s=move1->next; move1->next=max->next; max->next=s; maxpre->next=move1; pre1->next=max; move1=max; } } cout<<"已经按照从大到小排序"next==NULL){cout<<"没有学生记录,请添加"<读取记录 int student::display() { ifstream fin; char buf[100]; char str[25]; cout<<"请输入路径及文件名:"<str); fin.open(str); if(!fin) { cout<<"没有此文件"<fin) { fin.getline(buf,sizeof(buf)); cout<读取数据,并将数据保存在链表中 int student::readfiletolist() { ifstream fin; int i; char str[25]; cout<<"请输入路径及文件名:"<str); fin.open(str); if(!fin) { cout<<"没有此文件"fin.getline(p->name,100,'*'); i=0; while(i!=SUBJECT) { fin.getline(p->mark[i].subject,100,'*'); fin>>p->mark[i].score; p->totalmark+=p->mark[i].score; i++; } if(head->next==NULL) { head->next=p; p->next=NULL; } else { p=head->next; head->next=p; } } cout<<"信息已经保存在链表中"读取"findname[10]; int i; coutfindname)) { cout<<"经查找,找到该生信息如下:"<读取"<读取信息\n", "7:将文件信息保存在链表中\n", "8:根据姓名查找学生记录\n", "9:结束程序\n" }; cout<<" "<<"*****************************************************"<choice; } while(choice>9||choice<1); return choice; } int main() { int menuitem,flag=1; student stu; while(flag) { system("cls"); menuitem=showmenu(); switch(menuitem) { case 1:{stu.addstudent();break;} case 2:{stu.countmark();break;} case 3:{stu.sortbymark();break;} case 4:{stu.save();break;} case 5:{stu.show();break;} case 6:{stu.display();break;} case 7:{stu.readfiletolist();break;} case 8:{stu.searchbyname();break;} case 9:{flag=0;break;} } } return 0; }

64,282

社区成员

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

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