1. 程式人生 > >解決c++ ifstream in物件讀取檔案總多讀一次問題

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