fwrite到stdout - 未知的额外字节

时间:2018-05-11 20:49:09

标签: c++ fwrite

当使用fwrite写入stdout时,我会遇到奇怪的插入。

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

program.exe > stdout.txt

file.txt与original.txt相同。

与original.txt相比,

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

在stdout中插入的原因是什么?不确定我是否可以信任stdout。

测试分两步完成:

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;
}

0 个答案:

没有答案