读取超过127个ASCII值时,C++ cin失败

Jas*_*son 6 c++ cin character-encoding

我创建了一个包含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) { ... }
Run Code Online (Sandbox Code Playgroud)

虽然有趣的是,虽然这并没有阻止我在第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);
}
Run Code Online (Sandbox Code Playgroud)

jco*_*der 5

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

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


Rob*_*obᵩ 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";
}
Run Code Online (Sandbox Code Playgroud)