6

我创建了一个包含 256 个字符的文本文件,文本文件的第一个字符是 ASCII 值 0,文本值的最后一个字符是 ASCII 值 255。介于 0 到 255 之间的字符均匀递增。所以字符 #27 是 ASCII 值 27。字符 #148 应该是 ASCII 值 148。

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

我试过用cin. 我试过cin.get()and cin.read(),两者都应该读取未格式化的输入。但是在读取第 26 个字符时都失败了。我想当我使用 an 时unsigned charcin说它正在阅读 read in 255,这根本不是真的。而当我用正常的签名时charcin说是在读-1。它应该读取与 ASCII 等效的任何字符26。也许cin认为它被击中了EOF?但我之前读过不同的 StackOverflow 帖子,这EOF不是一个可以写的实际字符。所以我不知道为什么cin咳嗽代表整数-1或整数的字符值255. 有人可以告诉我我做错了什么,为什么,最好的解决方案是什么,为什么?

没有太多要粘贴的具体代码。我已经尝试了一些不同的非工作组合,所有这些组合都涉及cin.get()or 或cin.read()with any charor并在两者之间unsigned char调用强制转换。我没有运气能够阅读超过第 26 个字符,除了这个:charint

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);
}
4

3 回答 3

5

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

它仅在 cin 使用的文本模式下执行此操作,如果您以二进制模式打开蒸汽,则不会执行此操作。

于 2013-02-21T17:50:46.847 回答
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";
}
于 2013-02-21T17:48:42.777 回答
1

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

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

于 2013-02-21T19:53:59.087 回答