gpt4 book ai didi

c++ - 尝试读取 9 到 13 之间的无符号字符时,ifstream 的行为非常奇怪

转载 作者:行者123 更新时间:2023-12-04 19:09:44 28 4
gpt4 key购买 nike

我一直在用头撞墙试图理解这一点。我没有在网上找到任何东西,所以我在这里分享它以防有人启发我。

#include <iostream>
#include <fstream>

int main(){
std::ifstream in("bf", std::ios::binary);
if (!in)
return false;

unsigned char byte;
while (!in.eof()){
in >> byte;
if (in.fail()){
break;
}
std::cout<<(int)byte<<std::endl;
}
}

运行上面的代码,其中“bf”是这个 python 脚本生成的文件:
f = open('bf','wb')
arr = bytearray([i for i in range(20)])
f.write(arr)
f.close()

产生这个输出:
0
1
2
3
4
5
6
7
8
14
15
16
17
18
19

我正在运行 Ubuntu 18.04。任何人都可以复制这种行为吗?有谁知道发生了什么?

最佳答案

Python 脚本正在创建一个二进制文件,其内容为字节 0..19。然后,您的 C++ 代码将以二进制模式读取该文件并输出它读取的字节的数值。问题是它没有阅读您所期望的内容。

您的 C++ 代码存在两个问题:

  • you are using eof() incorrectly .
  • operator>>执行格式化读取,在这种情况下这不是您想要的。 operator>>忽略空格,字节 9..13 表示空格字符,这就是为什么您看不到它们被输出的原因。您需要一个未格式化的读取,例如通过 steam 的 get() 方法

  • 尝试这个:

    #include <iostream>
    #include <fstream>

    int main(){
    std::ifstream in("bf", std::ios::binary);
    if (!in)
    return false;

    char byte;
    while (in.get(byte)){
    std::cout << (unsigned int)byte << std::endl;
    }
    }

    Live Demo

    关于c++ - 尝试读取 9 到 13 之间的无符号字符时,ifstream 的行为非常奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59598275/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com