|
2006/7/2 下午 04:25:38
手上有一份ppt 希望可以分享給大家 http://moon.cse.yzu.edu.tw/~s932361/Inputstream.ppt 希望對輸入方面有問題的人可以參考一下^^
另外就是我想問一下問題 int main() { char str[20]; char numb[20]; cout << "numb" << endl; cin.getline(numb, 20); cout << "str" << endl; cin.getline(str, 20); cout << endl; cout << numb << endl; cout << str << endl; return 0; } // end main 為什今天我寫這樣的練習的時候當我資料輸入超過20個字母含空格之後,我第二個str就不用輸入了,自動跳過??以理論上來說,不是第一個getline會把istream裡面前19個字元輸入進去,在第二次的getline的時候才會把剩下的又自動取進去,結果怎麼連取進去都沒有完完全全沒東西??
而我用get的話才有我剛剛說的結果呢?才會有多輸入的自動填入str中 我希望做到用getline就算多輸入超過大小的話他也會刪除後面的istream的資料,我知道使用cin.ignore() 而且不會跳過下一個輸入~~ 我現在的情況是當我第一個資料輸入完,只要超過大小20就馬上結束輸入了,我第二個資料都還沒有輸入,讓我很傻眼,那也不用ignore()了直接跳過了。
|
|
|
2006/7/2 下午 09:40:27
MSDN對於getline有這麼一行描述: if the function extracts no elements or _Count - 1 elements, it calls setstate(failbit). 因此,推測是cin的旗標被設定成 failbit ,故無法繼續擷取字元 你可以嘗試在下一行接著清除所有的錯誤旗標 ex: cin.clear();
|
|
|
2006/7/3 下午 12:39:48
看完一些文件,好像使用std::string是最佳的解決辦法了
文件上所說的
string str; getline(cin, str);
它的getline是一個friend function嗎?不是只有cin.getline才有這個成員函式嗎? 怪怪的getline(cin, str);不太了解是什麼意思。 但是看完不少教學文章,好像都建議使用string標準物件
|
|
|
2006/7/3 下午 01:41:28
呼~~經過超過37小時的沒有睡,已經找到根本的解決辦法了,順便貼出來不知道對大家有沒有幫助
void my_getline(char*, int); int main() { char name[20]; char num[20]; cout<<"input 1:"; my_getline(name, 20);
cout<<"input 2:"; my_getline(num, 20);
cout << name << endl; cout << num << endl; cout<<"end input!\n"; return 0; } void my_getline(char* source, int size) { cin.getline(source, size); if (cin.bad())//判斷是否錯誤發生 { cin.clear();//清除錯誤 while (cin.get() != '\n'); //使用get()把剩下所有出現在istream資料全吃掉,當執行判斷的時候cin.get()先執行,所以也吃掉'\n',剩下的istream就空空的了 } } 這樣不論資料輸入多還是少都可以非常正常的運行
|
|
|
2006/7/3 下午 10:50:00
>int main() >{ > char str[20]; > char numb[20]; > cout << "numb" << endl; > cin.getline(numb, 20); > cout << "str" << endl; > cin.getline(str, 20); > cout << endl; > cout << numb << endl; > cout << str << endl; > return 0; >} // end main >為什今天我寫這樣的練習的時候當我資料輸入超過20個字母含空格之後,我第二個str就不用輸入了,自動跳過??以理論上來說,不是第一個getline會把istream裡面前19個字元輸入進去,在第二次的getline的時候才會把剩下的又自動取進去,結果怎麼連取進去都沒有完完全全沒東西??
你不是有這本書嗎?
The C++ Standard Library, Nicolai Josuttis
第 608 頁, istream& istream::getline(char *str, streamsize count)
"if they read lines with more than count-1 characters, they set failbit."
再看第 599 頁, 後面算起第二段:
"Note that you always have to clear error bits explicitly. In C it was possible to read characters after a format error. ... this is different in C++. if failbit is set, each following stream operation is no-op until failbit is cleared explicitly."
>看完一些文件,好像使用std::string是最佳的解決辦法了
通常是.
>文件上所說的 > >string str; >getline(cin, str); > >它的getline是一個friend function嗎?
它是一個 global function. 完整的名字是: std::getline().
>不是只有cin.getline才有這個成員函式嗎?
這是 std::istream 的成員函式.
>呼~~經過超過37小時的沒有睡,
這不太健康 ^^
む略め
>void my_getline(char* source, int size) >{ > cin.getline(source, size); > if (cin.bad())//判斷是否錯誤發生 > { > cin.clear();//清除錯誤 > while (cin.get() != '\n'); //使用get()把剩下所有出現在istream資料全吃掉,當執行判斷的時候cin.get()先執行,所以也吃掉'\n',剩下的istream就空空的了 > } >}
可以更簡單一點:
void my_getline(char* source, int size) { if (!cin.getline(source, size)) { cin.clear(); cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } }
cin.getline() 傳回一個 cin 的物件. std::ios_base 內有超載 operator!, 等于直接呼叫 fail().
|
|
|
2006/7/3 下午 11:30:05
原來如此,這樣也行,我都沒有去翻那本書^^因為放在中壢
不過還有這樣簡單的寫法,實在太神了 不過上面的寫法我也是想破頭才想出來的嗚~~~
|
|
|
2006/7/4 下午 07:18:39
>可以更簡單一點: > > void my_getline(char* source, int size) > { > if (!cin.getline(source, size)) > { > cin.clear(); > cin.ignore(std::numeric_limits<std::streamsize>::max(), '' ''); > } > } > >cin.getline() 傳回一個 cin 的物件. std::ios_base 內有超載 operator!, 等于直接呼叫 fail(). > 這樣的意思是不是說如果getline()不成功的話badbit set or failbit set 所以先清除clear()flag中的錯誤,之後使用ignore()把istream裡面所有料全都清掉或直到遇到'\n'這樣嗎?因為我手上沒有帶那本std所以std::numeric_limits<std::streamsize>max()這個要去那裡查阿,我都查不到
|
|
|
2006/7/4 下午 11:19:52
>這樣的意思是不是說如果getline()不成功的話badbit set or failbit set 所以先清除clear()flag中的錯誤,
是.
>之後使用ignore()把istream裡面所有料全都清掉或直到遇到'\n'這樣嗎?
http://msdn2.microsoft.com/en-us/library/3w23zf49.aspx
一直 ignore 到找到第二個 argument 設定的字元, 然後把那個字元也清掉.
>因為我手上沒有帶那本std所以std::numeric_limits<std::streamsize>max()這個要去那裡查阿,我都查不到 >
書裡就有這個使用的例子.
MSDN 有 numeric_limits 的章節, 但書本教得比較清楚.
http://msdn2.microsoft.com/en-us/library/34stz20a.aspx
|
|
|
2006/7/5 上午 02:05:14
太好了,明天做一趟火車去中壢拿回我的書^^
|
|
|
|
|
|
C++ |
 |
|
|
專家等級 |
評價 |
|
|
一代宗師 |
10000 |
|
|
曠世奇才 |
5000 |
|
|
頂尖高手 |
3000 |
|
|
卓越專家 |
1500 |
|
|
優秀好手 |
750 |
|
|
|
|
|
|
|
|
|
Microsoft Internet Explorer
6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/ |
|
|