C++ C++;逐符号读取字符

C++ C++;逐符号读取字符,c++,stream,char,cin,C++,Stream,Char,Cin,我需要一个符号一个符号地读。但直到输入结束我才知道如何阅读。例如,测试系统将cin>>某些变量m次。我必须一个符号一个符号地阅读所有字符。只有m次。我该怎么做?试试这个: #include <iostream> using std::cin; using std::cout; int main(int argc, char *argv[]) { char ch; unsigned m = 10; while (cin && m--) {

我需要一个符号一个符号地读。但直到输入结束我才知道如何阅读。例如,测试系统将cin>>某些变量m次。我必须一个符号一个符号地阅读所有字符。只有m次。我该怎么做?

试试这个:

#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;
}
#包括
使用std::cin;
使用std::cout;
int main(int argc,char*argv[])
{
char ch;
无符号m=10;
而(cin&m--){
cin.read(&ch,sizeof(ch));

cout有几种方法可以一次读一个字符,直到你全部读完为止,但没有一种方法一定是最好的

就个人而言,我会使用以下代码:

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

如果只需要读取<代码> M< /COD>字符,请考虑使用<代码> < <代码>循环:

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

请注意最后一行–这将告诉您是否已实际读取了
m
个字符。

如果要逐个字符格式化输入,请执行以下操作:

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
}
如果要读取原始字节,请执行以下操作:

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
}

在这两种情况下,
infle
应该是
std::istream&
或类似的类型,例如文件或
std::cin

尝试将其放入字符串中。您是在输入结束前读取m次,还是在读取m个符号?或者查看
istream::get(char*buffer,size\t len,char delimiter)
istream::read(字符*缓冲区,大小长度)
如果您想要所有字节,包括空格和换行符,为什么从
char*
转换为
char*
?此解决方案不读取m个符号,或者直到EOF,m次才重复读取。@TravisGockel没有理由这样做。修复:)此解决方案不读取m个符号或不重复读取until EOF,m次。+1用于更新,特别是在
for
循环中覆盖EOF情况。对于读取原始字节(symbos),
cin.read
方法通常效率更高,至少它使用更少的函数调用。@ThomasMatthews:谢谢,我也考虑过这一点——我添加了替代版本。