c++ - 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;
}
解决方案
推荐阅读
- python-3.x - Python多处理列表操作
- maven - 为什么故障安全 forkCount 不应该为零?
- node.js - NodeJS - 框架推荐?
- graphql - 使用 Fastify 的 Apollo Graphql
- c# - 为什么我在终端运行时看不到我在 VS Code 中用 C# 编写的程序的输出
- ios - 带有自定义框架的 Flutter ios 插件
- ios - UIKit Swift 5:如何每分钟更新一次 UI
- django - django Localdate 不返回正确的日期
- spring - Spring Boot @Component 不会创建 Bean
- jquery - 如何在表格绘制时触发 initComplete?