我需要逐個符號地讀取。但我不知道如何閱讀,直到輸入結束。作爲例子,測試系統將會執行m次>> somechar變量。我必須閱讀符號的所有字符。只有m次。我如何做到這一點?C++ cin char逐符號讀取
回答
如果你想格式化輸入字符一個字符,這樣做:
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
。
爲了讀取原始字節(符號),'cin.read'方法通常更高效,至少它使用更少的函數調用。 –
@ThomasMatthews:謝謝,我也想過 - 我添加了替代版本。 –
試試這個:
#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;
}
一個'char *'到'char *'? –
此解決方案不會讀取* m *符號量,或者直到EOF * m *次才重複讀取。 –
@ThomasMatthews固定。 – Sergey
有幾種方法同時讀取一個字符,直到您已經閱讀他們,和他們都不一定是最好的。
就個人而言,我會用下面的代碼去:
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
字符已實際讀取。
此解決方案不會讀取m個符號或直到EOF m次纔會重複讀取。 –
@Thomas查看更新。 –
+1進行更新,特別是覆蓋'for'循環中的EOF情況。 –
- 1. 用cin讀取字符(C++)
- 2. 逐行讀取文件,逐字符C
- 3. 閱讀char和在C號
- 4. 讀「無符號整型」使用「CIN」
- 5. C++逐行讀取文件
- 6. 逐行讀取字符串
- 7. std :: cin >> char
- 8. C++「cin」只讀取第一個字
- 9. 用std :: cin整行讀取
- 10. C++ char返回輸出符號
- 11. 驗證char *取自std :: cin的長度
- 12. 逐個讀取文件中的字符
- 13. 從STD讀取密碼:: CIN
- 14. 在變量中逐詞讀取
- 15. 從管道中逐行讀取C
- 16. 用excel數據逐行讀取c#.net
- 17. 逐行讀取Unicode文件C++
- 18. 逐字符讀取文本文件
- 19. 逐行讀取字符串X86 64
- 20. Perl逐行讀取
- 21. GZIPInputStream逐行讀取
- 22. C++ CIN問題
- 23. C++ cin問題
- 24. C++用cin
- 25. c從文件中逐一讀取字符?
- 26. unsigned char char *從C++ WinSock客戶端到C#服務器的無符號char *
- 27. 從文件中逐行逐行讀取C
- 28. 比特移位`char`與`無符號char`
- 29. getchar()和逐行讀取
- 30. 從popen()讀取輸入到char *中C
試着把它放入一個字符串中。 –
您是否正在閱讀直至輸入結束,* m *次,或者您正在閱讀* m *符號量? –
如果你想要包括空白和換行符在內的所有字節,請查看'istream :: get(char * buffer,size_t len,char delimiter)'和'istream :: read(char * buffer,size_t len)' –