c++ - 为什么从二进制文件中读取这个流会在 0x1A 字符处停止?

标签 c++ io filestream

<分区>

我发现 0x1A 是 Substitute 但我不确定这意味着什么以及流读取停止的原因。我当然也想知道如何解决这个问题。

首先,我使用以下代码生成二进制文件:

unsigned char bytes[] = { 
    0xA1, 0x58, 0x02, 0x01, 0x03, 0x02, 0x01, 0x15, 0x30, 0x50, 0x55, 0x04, 0x02, 0x00, 0x00, 0x00, 
    0xA7, 0x48, 0xA0, 0x46, 0xA4, 0x44, 0xA7, 0x42, 0x04, 0x40, 0x8A, 0x00, 0x35, 0x2C, 0x77, 0x58, 
    0x83, 0xE9, 0x78, 0x9F, 0x4F, 0x34, 0x06, 0xE1, 0xB2, 0x57, 0x3A, 0x0C, 0xEF, 0x18, 0x54, 0x54, 
    0x1A, 0x4D, 0xBF, 0x2D, 0x02, 0x36, 0x18, 0xCB, 0x4A, 0xC3, 0x58, 0x20, 0xFC, 0x92, 0xDE, 0xBC, 
    0x85, 0x94, 0x90, 0x27, 0x36, 0x05, 0xEA, 0xE5, 0xEA, 0xE6, 0x0B, 0x73, 0xEF, 0xD1, 0x9E, 0x85, 
    0x38, 0x57, 0x1E, 0xF6, 0x62, 0x9B, 0x8F, 0x74, 0xA3, 0x00 };

const size_t sz = sizeof(bytes) / sizeof(bytes[0]);

std::ofstream fstrm("binfile.bin", std::ofstream::binary);
std::for_each(bytes, bytes + sz, [&](const char ch) {
    fstrm.put(ch);
});
fstrm.close();

然后我使用 C++ 标准库 IO 函数来读取流,如下所示:

#include <iostream>
#include <iterator>     // std::istream_iterator
#include <algorithm>


int main() {

    unsigned char bytes[] = {
        0xA1, 0x58, 0x02, 0x01, 0x03, 0x02, 0x01, 0x15, 0x30, 0x50, 0x55, 0x04, 0x02, 0x00, 0x00, 0x00,
        0xA7, 0x48, 0xA0, 0x46, 0xA4, 0x44, 0xA7, 0x42, 0x04, 0x40, 0x8A, 0x00, 0x35, 0x2C, 0x77, 0x58,
        0x83, 0xE9, 0x78, 0x9F, 0x4F, 0x34, 0x06, 0xE1, 0xB2, 0x57, 0x3A, 0x0C, 0xEF, 0x18, 0x54, 0x54,
        0x1A, 0x4D, 0xBF, 0x2D, 0x02, 0x36, 0x18, 0xCB, 0x4A, 0xC3, 0x58, 0x20, 0xFC, 0x92, 0xDE, 0xBC,
        0x85, 0x94, 0x90, 0x27, 0x36, 0x05, 0xEA, 0xE5, 0xEA, 0xE6, 0x0B, 0x73, 0xEF, 0xD1, 0x9E, 0x85,
        0x38, 0x57, 0x1E, 0xF6, 0x62, 0x9B, 0x8F, 0x74, 0xA3, 0x00 };

    const size_t sz = sizeof(bytes) / sizeof(bytes[0]);

    std::cout << "cout with array\n";
    std::for_each(bytes, bytes+sz, [](unsigned char ch) {
        std::cout << std::hex << (int)ch << ' ';
    });
    std::cout << "\n\n";

    std::istream_iterator<unsigned char> eos;              // end-of-stream iterator
    std::istream_iterator<unsigned char> iit(std::cin);   // stdin iterator

    std::cout << "cout with stdin - redirecting file of same bytes as above\n";
    std::for_each(iit, eos, [](unsigned char ch) { 
        std::cout << std::hex << (int)ch << ' ';  
    });

    std::cout << '\n';
}

如果我这样调用我的程序:

myprog <binfile.bin

我得到的输出是:

cout with array
a1 58 2 1 3 2 1 15 30 50 55 4 2 0 0 0 a7 48 a0 46 a4 44 a7 42 4 40 8a 0 35 2c 77
 58 83 e9 78 9f 4f 34 6 e1 b2 57 3a c ef 18 54 54 1a 4d bf 2d 2 36 18 cb 4a c3 5
8 20 fc 92 de bc 85 94 90 27 36 5 ea e5 ea e6 b 73 ef d1 9e 85 38 57 1e f6 62 9b
 8f 74 a3 0

cout with stdin - redirecting file of same bytes as above
a1 58 2 1 3 2 1 15 30 50 55 4 2 0 0 0 a7 48 a0 46 a4 44 a7 42 4 40 8a 0 35 2c 77
 58 83 e9 78 9f 4f 34 6 e1 b2 57 3a ef 18 54 54

为什么输入读取在 0xA1 字符处停止?如何获取读取完整二进制文件的代码?

最佳答案

因为 0x1A 是“Ctrl+Z”,Windows 上的“输入结束”字符,而您正在文本模式下从 stdin 读取。

You can set the stream into binary mode ,但不是以与平台无关的方式。一般来说,如果你想编写可移植的代码,请避免从 stdin 获取二进制输入——而是将文件名作为命令行参数传递。

关于c++ - 为什么从二进制文件中读取这个流会在 0x1A 字符处停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32796432/

相关文章:

c# - 写入 FileStream 时 c# 中的 OutOfMemoryException

c# - 有没有办法使用 "using"但保持文件打开?

c++ - 赋值运算符复制数组中除可用空间以外的所有内容

c++ - C++ 中奇怪的 getline 行为

c++ - static_cast 整数到枚举的转换

io - 使用相同的 key 写入现有的 Julia 数据文件

C++文件流问题

c++ - GTest,仅参数化测试用例

c# - StreamReader 问题查找文件

java - 设置一个用Java读取的阻塞文件