当使用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;
}