解决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;
}

读取文件字符串时候总是会多读一次
解决c++ ifstream in对象读取文件总多读一次问题

查阅了资料后:
https://www.cnblogs.com/youxin/p/3793814.html
发现问题出在,fin对象在读取文件的时候,读到6463后,再读一次才能判断到eof
因此最后一行会被读取两次
解决方法是在while循环中加入判断,

  • 对于c风格的字符串可以使用
    if(a[0]='\0') break;其中a是第一个被读入的对象
  • 更加通用的形式:
    if (in.fail() ) break;

解决c++ ifstream in对象读取文件总多读一次问题
完美解决了最后文件末尾读两次

读取文件流模板:

#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;
    }
}