2011-11-22 57 views
2

我的問題是,我想讀取std::cin的輸入,但不知道輸入的時間。我也必須char,不能使用std::string。 我需要處理兩種方法: a)用戶輸入文本,當他點擊[ENTER]時程序停止讀取。 b)用戶將std::cin重定向到一個文件(如.\a.oput < file),該文件可以容納多行。如何從std :: cin讀取直到流結束?

編輯:只是注意到std :: cin.eof()在讀取文件的情況下也總是爲false。

對於a)我可以閱讀,直到\ n發生。對於b)編輯:沒有(我可以閱讀,直到std :: cin.eof()發生。) 但是,當我不知道我是否得到a)或ab)問題,我怎麼能打破閱讀過程?

這是我的)...

char buffer = ' '; 
while(std::cin >> std::noskipws >> buffer && buffer != '\n') 
{ 
    // do some stuff with buffer 
} 

...和b)

char buffer = ' '; 
while(std::cin >> std::noskipws >> buffer) 
{ 
    // do some stuff with buffer 
} 

而且我知道有std::cin.tellg()獲得流中的當前位置。

編輯:所以好像在文件的情況下,輸入數據流被終止,在std::cin >> std::noskipws >> buffer得到false的方式。 什麼上面的代碼做了):

  • 它等待用戶進行輸入,然後按[ENTER]
  • 然後它遍歷每個CHAR通過在最後一行用戶輸入。
  • 然後再次等待用戶進行輸入,然後按[ENTER]
  • 無限等待處理迴路

那麼我該怎麼辦呢?

+1

告訴我們你爲什麼不能用'性病:: string'。也許我們也可以幫助你解決這個問題。 –

+0

對於非標準的代碼,你可以在'conio.h'中使用'kbhit()' –

+0

@Rob它來自於exercies,我們不知道'std :: string'。 我們也不能使用非標準的代碼。 我所問的並不是直接要求在exercies中,但我只是好奇... – Lukas

回答

2

您可能需要輸入始終結束EOF(意思是從要求按下^D的命令行),然後像往常一樣使用b進程。那麼這將使從CMDLINE多輸入以及

+0

我可以要求,但如果我不能? (什麼是Linux的shell/Windows的 '外殼' 的鍵擊^ d?) – Lukas

+2

在Windows中,按Ctrl + Z –

+0

而在一行寫的時候它纔會工作。 – Lukas

0

你可以使用的(舊)getline功能,這需要一個指向一個字符數組,可以使用分隔符。但是你無法確保在任何情況下它都會讀取到eof(因爲字符緩衝區可能太小),但是使用char數組而不注意它的大小是非常危險的(並且從安全的災難性的一點),因爲它可以導致buffer-overflows這可以很容易地被利用。

此代碼應允許您通過線從輸入提取行:

char buffer[256]; 
while(getline(buffer,256,'\n')) { //get a line 
    /* do something with the line */ 
} 

這讀字符的最高金額:

char buffer[256]; 
while(getline(buffer,256)) {//get a maximum amount out of the input 
    /* do something with the line */ 
} 
+0

當然,我可以做到這一點,但我也得到256字符的限制一行... – Lukas