我需要逐个符号地读取。但我不知道如何读取到输入的结尾。例如测试系统将使用cin>>一些字符变量m次。我必须逐个符号地读取所有字符,仅m次。我该怎么做?
有多种方法可以逐个读取字符,直到读取完所有字符,但没有一种方式是最好的。
个人建议使用以下代码:
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(&buffer[0], m);
unsigned total_read = cin.gcount();
注意最后一行 - 这将告诉您实际读取了多少个字符m
。
for
循环中涵盖了 EOF 的情况。 - Thomas Matthewschar 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
方法通常更有效率,至少它使用较少的函数调用。 - Thomas Matthews试试这个:
#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*
? - Travis Gockel
istream::get(char* buffer, size_t len, char delimiter)
和istream::read(char* buffer, size_t len)
。 - Mooing Duck