解決c++ ifstream in物件讀取檔案總多讀一次問題
阿新 • • 發佈:2018-12-22
先上原始碼
#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;
}
}