C++的cin如何逐个读取字符?

15

我需要逐个符号地读取。但我不知道如何读取到输入的结尾。例如测试系统将使用cin>>一些字符变量m次。我必须逐个符号地读取所有字符,仅m次。我该怎么做?


尝试将其放入字符串中。 - Mike D
你是在读取输入的末尾 m 次,还是读取 m 个符号? - Thomas Matthews
如果你想要包括空格和换行符在内的所有字节,请查看istream::get(char* buffer, size_t len, char delimiter)istream::read(char* buffer, size_t len) - Mooing Duck
3个回答

11

有多种方法可以逐个读取字符,直到读取完所有字符,但没有一种方式是最好的。

个人建议使用以下代码:

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


这个解决方案没有读取m个符号,也没有重复读取直到EOF,m次。 - Thomas Matthews
+1 对于这次更新表示赞赏,尤其是在 for 循环中涵盖了 EOF 的情况。 - Thomas Matthews

9
如果您想逐个字符地输入格式化文本,请按照以下步骤操作:
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方法通常更有效率,至少它使用较少的函数调用。 - Thomas Matthews
@ThomasMatthews:谢谢,我也考虑过这个问题——我添加了另一种版本。 - Kerrek SB

-1

试试这个:

#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* - Travis Gockel
这个解决方案不会读取m个符号,也不会重复读取直到EOF,m次。 - Thomas Matthews
@TravisGockel 没有必要这样做。已经修复 :) - Sergey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接