读取超过127个ASCII值时,C ++ cin失败

时间:2013-02-21 17:46:54

标签: c++ character-encoding cin

我创建了一个包含256个字符的文本文件,文本文件的第一个字符是ASCII值0,文本值的最后一个字符是ASCII值255.两者之间的字符均匀地从0到255递增。因此字符#27是ASCII值27.字符#148应该是ASCII值148。

我的目标是阅读此文本文件的每个字符。

我尝试用cin阅读此内容。我尝试了cin.get()cin.read(),两者都应该读取未格式化的输入。 但是在阅读第26个字符时都失败了。我认为当我使用unsigned char时,cin表示它正在阅读255中读取的内容真正。当我使用普通签名char时,cin表示它正在-1中阅读。应该读取ASCII 26的等效字符。也许cin认为它被点击EOF?但我之前已经阅读过单独的StackOverflow帖子,EOF不是一个可以写的实际角色。所以我很遗憾为什么cin在表示整数-1或整数255的字符值上咳嗽。有人可以告诉我,我做错了什么,为什么,最好的解决方案是什么,为什么?

没有太多具体的代码可以粘贴。我尝试了一些不同的非工作组合,所有这些组合都涉及cin.get()cin.read() charunsigned char,并且调用强制转换为char和{{介于两者之间。除了这个以外,我没有运气能够读过第26个角色:

int

有趣的是,虽然这并没有阻止我在第26个字符的while循环,但它也不会继续前进。它似乎是unsigned char character; while ( (character = (unsigned char)cin.get()) != EOF) { ... } ,它的cincin.get()只是在它检测到不喜欢的内容时拒绝前进到下一个字符。我也知道像cin.read()这样的东西存在,但我的输入是不可预测的;也就是说,我的文本文件的这256个字符只是一个测试用例,真正的输入是相当随机的。这是较大的家庭作业的一部分,但这个具体问题与作业无关;我只是坚持这个过程的一部分。

注意:我正在读取标准输入流,而不是特定的文本文件。似乎仍然没有直接的解决方案。我无法相信在cin.ignore()之前没有这样做过。

更新

在Windows上,它在字符26后停止可能是由于Ctrl-Z的原因。我对这个问题并不在乎。它只需要在Linux上运行。

在Linux上,它会读取0到127之间的所有字符。但它似乎没有从127到255读取扩展的ASCII字符。有一个“解决方案”程序产生我们应该模仿的输出,该程序能够以某种方式读取所有255个字符。

问题:如何使用cin读取所有255个ASCII字符?

解决

使用:

cin

3 个答案:

答案 0 :(得分:5)

我认为你在Windows上。在Windows平台上,字符26是ctrl-z,它在控制台中用于表示文件结尾,因此iostream认为你的文件以该字符结束。

它在cin正在使用的文本模式下执行此操作,如果您以二进制模式打开一个蒸汽,它将不会这样做。

答案 1 :(得分:3)

std::cin读取文本流,而不是任意二进制数据。

至于为什么第26个字符很有趣,你可能正在使用CP / M衍生物(例如MS-DOS或MS-Windows)。在这些操作系统中,Control-Z用作文本文件中的EOF字符。

<小时/> 修改: 在Linux上,使用g ++ 4.4.3,以下程序的行为与预期完全相同,打印数字0到255,包括:

#include <iostream>
#include <iomanip>

int main () {
  int ch;
  while( (ch=std::cin.get()) != std::istream::traits_type::eof() )
    std::cout << ch << " ";
  std::cout << "\n";
}

答案 2 :(得分:1)

这里有两个问题。第一个是在Windows中cin的默认模式是文本而不是二进制,导致某些字符被解释而不是输入到程序中。特别是第26个字符Ctrl-Z由于向后兼容性而被解释为文件结尾。

另一个问题是由于cin >>的工作方式 - 它会跳过空格。这显然包括空格,但也包括标签,换行符等。要阅读cin中的每个字符,您需要使用cin.get()cin.read()