字符编码-当读取超过127个ASCII值时,C++cin失败
character encoding - C++ cin fails when reading more than 127 ASCII values
我创建了一个有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()
与char
或unsigned char
,以及介于两者之间的char
和int
的调用类型转换。我没能读过第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()
。
- 为"adjacent"变量赋值时出现问题
- 具有未知值时的时间复杂性
- 当给定默认值时,为什么此模板参数推导失败
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 错误:在为指针赋值时,void值没有被忽略
- 打印问题.我在数组中打印值时遇到一些问题
- 输入较高值时的分段代码
- CIN 仅在输入非数字值时跳过下一个 CIN
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- 在C++中打印对的优先级队列的所有值时出现问题
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- C++ 将元素分配给映射值时访问错误
- 变体 - 分配新值时是否清理旧值?
- 分配值时,C++ char* 指针上的前递增与后递增
- 尝试从动态分配的二维数组 C++ 中读取值时出现分段错误,并在尝试删除它时给出 munmap_chunk():
- 尝试设置唯一指针布尔数组的值时BAD_ACCESS错误
- 在擦除或修改作为不同索引键的值时,boost::multi_index 迭代器是否无效?
- 数组打印"random"值时出现问题
- c 字符串开始时ASCII值是什么
- 字符编码-当读取超过127个ASCII值时,C++cin失败