日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ getline 读不到东西_C++ getline()函数问题

發布時間:2025/4/5 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()函数问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。