【问题标题】:C++ cin char read symbol-by-symbolC++ cin char 逐个符号读取
【发布时间】:2011-12-02 12:22:42
【问题描述】:

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

【问题讨论】:

  • 试着把它放到一个字符串中。
  • 您是在阅读直到输入结束,m 次,还是在阅读 m 个符号?
  • 或者查看istream::get(char* buffer, size_t len, char delimiter)istream::read(char* buffer, size_t len)如果你想要所有字节包括空格和换行符

标签: c++ stream char cin


【解决方案1】:

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

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:谢谢,我也想过——我添加了替代版本。
【解决方案2】:

有几种方法可以一次读取一个字符,直到您将它们全部读完,但没有一种方法一定是最好的。

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

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 次才重复读取。
  • +1 表示更新,特别是在 for 循环中覆盖 EOF 情况。
【解决方案3】:

试试这个:

#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 次才重复读取。
  • @TravisGockel 没有理由这样做。固定:)
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多