字符编码-当读取超过127个ASCII值时,C++cin失败

character encoding - C++ cin fails when reading more than 127 ASCII values

本文关键字:值时 ASCII C++cin 失败 127个 编码 读取 字符      更新时间:2023-10-16

我创建了一个有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,以及介于两者之间的charint的调用类型转换。我没能读过第26个字符,除了这个:

unsigned char character;
while ( (character = (unsigned char)cin.get()) != EOF) { ... }

有趣的是,尽管这并没有阻止我在第26个字符处的while循环,但它也没有继续。它看起来像cin,无论是cin.get()还是cin.read(),只要检测到不喜欢的东西,就会拒绝前进到下一个字符。我也知道类似cin.ignore()的东西存在,但我的输入是不可预测的;也就是说,我的文本文件的这256个字符只是一个测试用例,实际输入是随机的。这是一个更大的家庭作业的一部分,但这个特定的问题与作业无关;我只是停留在这个过程的一部分。

注意:我读取的是标准输入流,而不是特定的文本文件。似乎仍然没有直接的解决方案。我不敢相信cin以前没有这样做过。

更新:

在Windows上,它在字符26之后停止,可能是因为Ctrl-Z的原因。我不太关心这个问题。它只需要在Linux上工作。

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

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

已解决

使用:

int characterInt;
unsigned char character;
while ( (characterInt = getchar()) != EOF )
{
            // 'character' now stores values from 0 - 255
    character = (unsigned char)(characterInt);
}

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

它只在cin使用的文本模式下这样做,如果你在二进制模式下打开一个steam,它就不会这样做。

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

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


编辑:在Linux上,使用g++4.4.3,以下程序的行为完全符合预期,打印数字0到255(包括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";
}

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

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