书上一道题,用未格式化版本的getline逐行读取一个文件,再将读到的内容打出来,我是这样编写的:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream input("C:/Users/0e/Desktop/1.txt");
char s[5];
while (!input.eof())
{
input.getline(s, 5, '\n');
cout<<s;
}
}
先不说别的问题,就说我的本意是用字符数组连续读写内容,为什么这个程序只能打出5个字符?
PHPz2017-04-17 13:16:23
呼叫 input.getline(s, 5, 'n');
, 會得到四種可能的流狀態, 拋去最嚴重的但最不常見的 badbit
不談. 剩下三種可能:
檔案裡不到 5 個字元, 狀態置為 eofbit. 程式輸出這些字元, 正常結束.
檔案裡超過5 個字元, 但頭5 個字元裡卻沒有指定的分隔符號'n', 狀態置為failbit, 輸出流裡已經讀入的字元後, 拋出異常. 但因為狀態並不是eofbit, 所以死循環, 不斷拋異常, 流裡已經無字符讀入, 故造成你說的現象.
檔案裡超過5 個字元, 且頭5 個字元裡包含指定的分隔符號'n', 狀態置為goodbit, 輸出流裡的字元, 繼續下一個循環, 直到遇到1 or 2的情況.
這就是原因.
再說說這種情況下 getline 應該怎麼用.
因為我不知道你的 1.txt 是啥內容, 改為 stringstream
是一樣的, 修改你的程式如下:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
istringstream input("das\ndsa\nddas\ndass\nad\nsadasd");
char s[5];
while (input.getline(s, 5, '\n'))
{
cout << s << endl;
cout << "(" << input.rdstate() << ")" << endl; // debug: goodbit
}
cout << "(" << input.rdstate() << ")" << endl; // debug: failbit
}
為了說明原因, 我用括號輸出了當前流狀態. 輔助你理解.