我创建了一个包含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
和{{介于两者之间。除了这个以外,我没有运气能够读过第26个角色:
int
有趣的是,虽然这并没有阻止我在第26个字符的while循环,但它也不会继续前进。它似乎是unsigned char character;
while ( (character = (unsigned char)cin.get()) != EOF) { ... }
,它的cin
或cin.get()
只是在它检测到不喜欢的内容时拒绝前进到下一个字符。我也知道像cin.read()
这样的东西存在,但我的输入是不可预测的;也就是说,我的文本文件的这256个字符只是一个测试用例,真正的输入是相当随机的。这是较大的家庭作业的一部分,但这个具体问题与作业无关;我只是坚持这个过程的一部分。
注意:我正在读取标准输入流,而不是特定的文本文件。似乎仍然没有直接的解决方案。我无法相信在cin.ignore()
之前没有这样做过。
更新
在Windows上,它在字符26后停止可能是由于Ctrl-Z的原因。我对这个问题并不在乎。它只需要在Linux上运行。
在Linux上,它会读取0到127之间的所有字符。但它似乎没有从127到255读取扩展的ASCII字符。有一个“解决方案”程序产生我们应该模仿的输出,该程序能够以某种方式读取所有255个字符。
问题:如何使用cin
读取所有255个ASCII字符?
使用:
cin
答案 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()
。