2016-04-23 162 views
2

我有一個快速的問題 - 我怎麼可能寫在控制檯窗口std::cin沒有分配給stringchar[]?然後如何讀取存儲在緩衝區中的字符數?如何讀取輸入流緩衝區中存儲的字符數

假設我想創建一個char的數組,但它應該具有輸入長度的大小。我可能會創建一個緩衝區或一個大尺寸的變量來存儲輸入,然後讀取它的長度,將內存分配給我的char數組並將其複製。但讓我們也說我是一個純粹主義者,我不想使用任何額外的(流緩衝區)內存。是否有可能訪問std::cin緩衝區,讀取存儲的字符數並將它們複製到我的數組中?我試圖找到幾個小時的答案,閱讀cpp參考,但我真的找不到解決方案。我甚至無法找到是否有可能寫入std::cin緩衝區而不將其分配給變量,也就是執行cin >> variable。如果您有針對此問題的其他解決方案,我將不勝感激。

另外,有人知道在哪裏可以找到有關緩衝區如何工作的信息(指計算機存儲鍵盤輸入,如何處理以及iostream如何與計算機一起從中提取數據)。

非常感謝!

+0

「將某些內容寫入std :: cin緩衝區而不將其指定給變量,又名執行cin >>變量」 - 是否指「** read ** from std :: cin」?這就是你的「aka」部分所做的。 – Cubbi

回答

1

首先,爲了填充輸入緩衝區,您需要執行某種讀取操作。讀操作可能不需要將讀入的內容放入變量中。例如,cin.peek()可能會阻塞,直到用戶輸入某個值並返回將從緩衝區讀取的下一個字符而不提取它,或者您還可以使用cin.get以及cin.putback

然後,您可以使用streambuf::in_avail函數來確定輸入緩衝區中有多少個字符,包括一個新的行字符。

考慮到這一點,你可以做這樣的事情:

char ch; 
cin.get(ch);//this will block until some data is entered 
cin.putback(ch);//put back the character read in the previous operation 
streamsize size=cin.rdbuf()->in_avail();//get the number of character in the buffer available for reading(including spaces and new line) 
if(size>0) 
{ 
    char* arr=new char[size];//allocate the size of the array(you might want to add one more space for null terminator character) 

    for(streamsize i=0;i<size;i++) 
     cin.get(arr[i]);//copy each character, including spaces and newline, from the input buffer to the array 

    for(streamsize i=0;i<size;i++) 
     cout<<arr[i];//display the result 
} 

話雖這麼說,我相信你有這樣做的一個具體的理由,但我不認爲這是個好主意做這樣的I/O。如果您不想估計需要輸入的字符數組的大小,則始終可以使用std::string並讀取輸入。

+0

好的。所以我複製了這段代碼並執行了它,但無論我給了什麼輸入,我總是有size = 0。還有 - 爲什麼在cpp引用中沒有提到istream :: peak()在新行字符是帶來了什麼?畢竟,只要沒有給出特定字符,就有輸入方法。 – zuroslav

+0

正如你所說的那樣,當沒有什麼要從流中讀取時它會返回'eof',我相信這是標準行爲。你可以用'char ch; cin.get(CH); cin.putback(ch);',這將讀取輸入中的第一個字符,並在調用'in_avail'之前將其放回流中。我修改了答案。這兩種方法都適用於我的平臺。 –

+0

@zuroslav另外還有一個輸入函數,它返回(獲取)給它們的任何輸入,比如'cin.get()'。所以'cin.peek()'在返回之前不會等待一個特定的字符,它只是從輸入流中讀取下一個字符,不管是否包含新行的字符,都不會提取並返回。 –

相關問題