解决c++ ifstream in对象读取文件总多读一次问题
先上源码
#include <iostream>
#include <fstream>
#include "xitong.h"
using namespace std;
int main(int argc, char const *argv[])
{
string a, b, c;
ifstream in;
int cnt = 0;
in.open("C:\\Users\\oyx\\Desktop\\algorithm\\xianxingjiegou\\hash\\student_sort.txt");
if (!in)
cout << "无学生信息,请先输入。" << endl;
else
{
//文件io 里面eof()如果遇到文件尾部则
//会直接退出
while (!in.eof())
{
//student类函数
in>>a>>b>>c;
//判断是否到文件的末尾
cout<<a<<b<<c<<endl;
}
in.close();
cout << "读取学生信息成功! " << endl;
}
system("pause");
return 0;
}
读取文件字符串时候总是会多读一次
查阅了资料后:
https://www.cnblogs.com/youxin/p/3793814.html
发现问题出在,fin对象在读取文件的时候,读到6463后,再读一次才能判断到eof因此最后一行会被读取两次
。
解决方法是在while循环中加入判断,
- 对于c风格的字符串可以使用
if(a[0]='\0') break;
其中a是第一个被读入的对象 - 更加通用的形式:
if (in.fail() ) break;
完美解决了最后文件末尾读两次
读取文件流模板:
#include<fstream>
int main()
{
ifstream in;
in.open("filename",std::in);
if (!in)
cout << "fail." << endl;
else
{
//文件io 里面eof()如果遇到文件尾部则
//会直接退出
//但是问题是需要两次读取最后的一行才能碰到尾部
//因此加入了in.fail()来提前结束
while (!in.eof())
{
in>>a>>b>>c;
//判断是否到文件的末尾
if (in.fail())
break;
//输出到屏幕
cout<<a<<b<<c<<endl;
}
in.close();
cout<<"success!"<<endl;
}
}