2011-10-06 103 views
9

我需要逐個符號地讀取。但我不知道如何閱讀,直到輸入結束。作爲例子,測試系統將會執行m次>> somechar變量。我必須閱讀符號的所有字符。只有m次。我如何做到這一點?C++ cin char逐符號讀取

+0

試着把它放入一個字符串中。 –

+0

您是否正在閱讀直至輸入結束,* m *次,或者您正在閱讀* m *符號量? –

+0

如果你想要包括空白和換行符在內的所有字節,請查看'istream :: get(char * buffer,size_t len,char delimiter)'和'istream :: read(char * buffer,size_t len)' –

回答

5

如果你想格式化輸入字符一個字符,這樣做:

char c; 
while (infile >> c) 
{ 
    // process character c 
} 

如果你想讀原始字節,這樣做:

char b; 
while (infile.get(b)) 
// while(infile.read(&b, 1) // alternative, compare and profile 
{ 
    // process byte b 
} 

在這兩種情況下,infile應類型爲std::istream &或類似文件,如文件或std::cin

+0

爲了讀取原始字節(符號),'cin.read'方法通常更高效,至少它使用更少的函數調用。 –

+0

@ThomasMatthews:謝謝,我也想過 - 我添加了替代版本。 –

0

試試這個:

#include <iostream> 
using std::cin; 
using std::cout; 

int main(int argc, char *argv[]) 
{ 
    char ch; 
    unsigned m = 10; 
    while (cin && m--) { 
     cin.read(&ch, sizeof(ch)); 
     cout << ch; 
    } 
    return 0; 
} 
+1

一個'char *'到'char *'? –

+0

此解決方案不會讀取* m *符號量,或者直到EOF * m *次才重複讀取。 –

+0

@ThomasMatthews固定。 – Sergey

3

有幾種方法同時讀取一個字符,直到您已經閱讀他們,和他們都不一定是最好的。

就個人而言,我會用下面的代碼去:

char c; 
while (cin.get(c)) { 
    // Process c here. 
} 

如果你只需要讀取m字符,可以考慮使用for循環:

char c; 
for (unsigned int i = 0; i < m && cin.get(c); ++i) { 
    // Process c here. 
} 

這將運行,只要環滿足以下兩個條件:(1)小於m個字符已被讀取,並且(2)仍有字符要讀取。

但是,這兩種解決方案都有一個缺點:它們相對低效。一次閱讀m字符效率更高。

所以首先分配一個足夠大的緩衝區來存儲m字符,然後嘗試閱讀:

std::vector<char> buffer(m); 
cin.read(&m[0], m); 
unsigned total_read = cin.gcount(); 

通知的最後一行 - 這會告訴你是否m字符已實際讀取。

+0

此解決方案不會讀取m個符號或直到EOF m次纔會重複讀取。 –

+0

@Thomas查看更新。 –

+0

+1進行更新,特別是覆蓋'for'循環中的EOF情況。 –