首页 > 解决方案 > fwrite 到标准输出 - 未知的额外字节

问题描述

当使用 fwrite 写入标准输出时,我遇到了奇怪的插入。

我从original.txt读取到缓冲区,然后将缓冲区写入 file.txt 和 stdout。我将标准输出保存到标准输出.txt。所有文件都被视为二进制文件。

program.exe > stdout.txt

file.txt 变得与 original.txt 相同。

与 original.txt 相比,stdout.txt 有 3 个额外的字节,由每个 0x0A 之前的插入值 0x0D 组成。

插入标准输出的原因可能是什么?不确定我是否可以再信任标准输出。

测试分两步完成:

program.exe > stdout.txt

在第 16 行将 true 更改为 false 并运行:

program.exe

预期输出 - 插入的出现次数(偏移​​量、插入值、原始值):

6ec : d, a
c68 : d, a
ecc : d, a

代码:

#include <cstdio>
#include <iostream>
int main()
{
    // original.txt -> read_data
    char read_data[0x1000];
    FILE * original_p = fopen("original.txt", "rb");
    fread(read_data, 1, 0x1000, original_p);        
    fclose(original_p);

    //True  : write files.
    //False : compare files.
    if (true) 
    {
        // read_data -> file.txt
        FILE * file_p = fopen("file.txt", "wb");
        fwrite(&read_data[0], 1, 0x1000, file_p);
        fclose(file_p);

        // read_data -> stdout
        fwrite(&read_data[0], 1, 0x1000, stdout);
    }
    else
    {
        // stdout.txt -> stdout_data
        char stdout_data[0x1003];
        FILE * stdout_file = fopen("stdout.txt", "rb");
        fread(stdout_data, 1, 0x1003, stdout_file);
        fclose(stdout_file);

        // Compares read_data and stdout_data:
        int extra_offset = 0;   // Compensates for insertions in stdout_data.
        for (int n = 0; n < 0x1000;n++)
        {
            if (stdout_data[n + extra_offset] != read_data[n])
            {
                // Prints offset : stdout_data[n + extra_offset], read_data[n] 
                std::cout << std::hex <<
                    n << " : " <<  
                    (((unsigned int) stdout_data[n + extra_offset]) & 0xFF) << ", " <<
                    (((unsigned int) read_data[n]) & 0xFF) << "\n";

                extra_offset += 1;
            }
        }
    } 
    return 0;
}

标签: c++fwrite

解决方案


推荐阅读