【发布时间】:2013-02-21 17:46:53
【问题描述】:
我创建了一个包含 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);
}
【问题讨论】:
-
ASCII 从 0 到 127。字节值 128 到 255 不是 ASCII,尽管有大量(现在)糟糕的编码从 ASCII 中获取 0-127 和 ursup 128-255他们自己的邪恶目的。
-
@delnan 你为什么说糟糕? ISO 8859 编码在欧洲几乎是普遍的,甚至现在也很普遍。 (我倾向于使用 UTF-8,但在法国和德国仍有很多网站使用 ISO 8859-1 或 ISO 8859-15。请记住,
isalpha之类的内容不适用于 UTF-8。) -
@JamesKanze 我现在说太糟糕了,因为与 Unicode 编码不同,您实际上不能使用其中之一在任何单个字符串中表达大量字符,因为它们彼此不兼容,而且这是不可能的可靠地区分它们。我很清楚其中一些很受欢迎(我住在德国),但这并没有让它们变得更好,只会让它们变得陈旧。我也知道它们在创建时是一个有点合理的解决方案。但一到二十年以来,它们只是编码事故和痛苦的根源,不如 UTF-8。
-
即使有所有这些 Ctrl-Z 或 text-mode-not-binary-mode 问题,为什么
read()和get()会失败? -
可能是因为您错误地使用了
get()。正确用法是:int character; while ( (character = cin.get()) != EOF) { ... }
标签: c++ character-encoding cin