c++ getline 读不到东西_C++ getline()函数问题
你的位置:
問答吧
-> C/C++
-> 問題詳情
C++ getline()函數問題
在下面這段代碼中,是先把一個文件中字符按行存貯在一個vector容器中,然后用sstream對象來實現逐單詞輸出字符。
我用的文件是在一個網站上復制的一個英文短笑話
Who Are Crooks?
A newspaper once carried an editorial which stated
bluntly that half the city council were crooks.
Under penalty of arrest, the editor issued
following retraction: HALF THE CITY COUNCIL AREN'T CROOKS.
From: http://www.hxen.com/englisharticle/xiaohua/2011-08-28/153213.html
發現一個問題,當while(getline(input,line))時,最后一行那個網址可以存儲到vector中,
當用while(getline(input,line),!input.eof())時,最后一行那個網址則沒有存儲,是什么問題造成的?求解答
代碼如下:
#include
#include
#include
#include
#include
using namespace std;
int main()
{
string filename,word,line;
cout<
cin>>filename;
ifstream input(filename.c_str());
if(!input)
cout<
vector svec;
while(getline(input,line))
svec.push_back(line);
input.close();
for(vector::iterator iter = svec.begin();
iter != svec.end(); ++iter)
{
istringstream isstr(*iter);
while(isstr >> word)
cout<
}
system("pause");
return 0;
}
作者: zq273632878
發布時間: 2011-08-31
應該是先讀到了,此時input已經到了末尾,所以 !input.eof()條件不滿足
作者: bdmh
發布時間: 2011-08-31
while(getline(input,line),!input.eof())
while里為啥用 ,毫無意義
看看下面代碼輸出啥
int i = (1,2);
cout<
作者: luciferisnotsatan
發布時間: 2011-08-31
最后一行 eof了,而while的取值是!input.eof(),前面那個對while來說沒意義
作者: luciferisnotsatan
發布時間: 2011-08-31
讀完最后一行的最后一個字節的時候,由于沒有遇到換行符,所以還會繼續嘗試往后讀,于是發生 EOF。
但是這個 getline 調用確實正常地讀到了數據,所以輸入流只設置 eofbit,不設置 failbit。
作者: hpsmouse
發布時間: 2011-08-31
引用 2 樓 luciferisnotsatan 的回復:
while(getline(input,line),!input.eof())
while里為啥用 ,毫無意義
while 里用逗號操作符通常是希望先讓前面那個表達式產生副作用,然后再判斷后面的條件。
作者: hpsmouse
發布時間: 2011-08-31
引用 4 樓 hpsmouse 的回復:
讀完最后一行的最后一個字節的時候,由于沒有遇到換行符,所以還會繼續嘗試往后讀,于是發生 EOF。
但是這個 getline 調用確實正常地讀到了數據,所以輸入流只設置 eofbit,不設置 failbit。
不太明白,能不能詳細的解釋下。兩個while語句的判斷條件分別是什么?
為什么while(getline(input,line),!input.eof())時,在那個網址之前會設置eofbit?還是不太明白.
while(getline(input,line))的判斷條件又是什么?
作者: zq273632878
發布時間: 2011-08-31
不要使用
while (條件)
更不要使用
while (組合條件)
要使用
while (1) {
if (條件1) break;
//...
if (條件2) continue;
//...
if (條件3) return;
//...
}
因為前兩種寫法在語言表達意思的層面上有二義性,只有第三種才忠實反映了程序流的實際情況。
典型如:
下面兩段的語義都是當文件未結束時讀字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此時已經feof了!
//...
}
而這樣寫就沒有問題:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
類似的例子還可以舉很多。
作者: zhao4zhong1
發布時間: 2011-08-31
輸入流產生 EOF 的條件是,在已經讀入最后一個字符的情況下,嘗試從流中繼續讀取。
getline 遇到換行符或者 EOF 都會停止。如果最后一行的結尾處沒有換行符,那么只能是遇到 EOF 停止,這時就會發生 getline 讀到了數據,也產生了 EOF 的情況。
作者: hpsmouse
發布時間: 2011-08-31
getline(is, str) 返回 is 的引用,istream 類型存在一個到 void* 類型的轉換,這個 void* 可以進一步轉換為 bool。其最終效果相當于調用了 istream::fail() 進行判斷。
產生 failbit 的過程有點啰嗦,暫時可以理解為輸入失敗就會產生 failbit。
對于 getline 來說,由于不能確定最后一行的結尾有沒有換行符,所以應該判斷 failbit,不應該判斷 eofbit。
作者: hpsmouse
發布時間: 2011-08-31
出現這種情況是因為樓主的while條件寫的不對,樓主可以寫成
C/C++ code
while(!input.eof(),getline(input,line))
如果按樓主的那種寫法,實際上最后一行已經讀進了line變量,這時文件已經結束了,在樓書測試!input.eof時返回false,這時循環條件不成立,循環結束,那么也就無法在循環體內把最后一行存儲在vecto中了。
作者: lvjing_CSDN
發布時間: 2011-08-31
引用 10 樓 lvjing_csdn 的回復:
出現這種情況是因為樓主的while條件寫的不對,樓主可以寫成
C/C++ code
while(!input.eof(),getline(input,line))
如果按樓主的那種寫法,實際上最后一行已經讀進了line變量,這時文件已經結束了,在樓書測試!input.eof時返回false,這時循環條件不成立,循環結束,那么也就無法在循環體內把最后一行存儲在vecto中了。
逗號表達式的值是最后一個表達式的值,所以這個和 while(getline(input,line)) 其實是一回事。
按照你描述的意思應該寫成 while(!input.eof() && getline(input, line)),這是對的,但是沒有必要。因為如果 input.eof() 為 true,getline(input, line) 一定會設置 failbit。
作者: hpsmouse
發布時間: 2011-08-31
你用了逗號表達式,逗號表達式是最后一個表達式的值。所以while(getline(input,line),!input.eof())
他會取!input.eof()的返回值作為最終結果。
作者: LCL_data
發布時間: 2011-08-31
額,居然用條件組合的while,這樣會給自己很多麻煩吧,不過用好了也蠻簡潔,對于你的while(getline(input,line),!input.eof())
語句, 應該清楚邏輯結構才行。 我沒有環境來跑你的程序,不過問題應該處于邏輯判斷上。
while中有兩個邏輯判斷
getline(input,line) 和
!input.eof()
這兩個判斷一定不會一起應用目標數據(input),所以呢,執行完getline(input,line),input已經被改動了,接著執行!input.eof()時就返回了false。
這個主要在于對while()的條件組合的理解吧。
你改成while(!input.eof(),getline(input,line))試試。如果成功了記得回復我一下哦。
作者: fmworld
發布時間: 2011-08-31
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的c++ getline 读不到东西_C++ getline()函数问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符编码在python中的处理与储存_p
- 下一篇: 怎么把异地车开回来?