c - 如何将二进制文件转换为包含整数和字符的文本文件
问题描述
我有一个二进制文件,其大小为 (sizeof(int)+sizeof(char)) 乘以二叉树中的节点数。int 是存储在每个节点上的数据,char 是到达文件中该部分时执行的操作。(i 用于插入,d 用于删除)我只需要知道如何将二进制文件转换为文本文件以进行测试。
输出应如下所示:
10 i
9 i
14 i
12 i
9 d
到目前为止,我的程序如下所示:
void convert(char * input, char * output)
{
FILE * fpin = fopen(input, "rb");
FILE * fpout = fopen(output, "w");
char * oper; // operation (either 'i' or 'd')
int key; // information to be held by a node
while ((fscanf(fpin, "%d%s", &key, oper) == 2) {
fprintf(fpout, "%d %s\n", key, oper);
}
fclose(fpin);
fclose(fpout);
}
但是,我收到一条警告说 oper 可能未初始化使用。
解决方案
首先,更改char *oper
为char oper
. 它不应该是一个指针。
我建议fread
改用。它只是读取固定数量的字节。用这个替换while:
while(1 == fread(&key, sizeof key, 1, fpin) &&
1 == fread(&oper, sizeof oper, 1, fpin)) {
// Print the values
}
我建议打印到标准输出,直到你得到你想要的结果。只是改变 fpout。
但是,请记住,您的代码不可移植。int 的大小可能因机器而异。
推荐阅读
- java - 有没有办法在 api 级别 25 下做类似 `requestDismissKeyGuard` 的事情?
- python - 在一个数据框中找到离另一个最近的索引
- javascript - 无法访问传递给子组件的道具
- javascript - 如何在 Firebase 函数中访问不同的集合
- android - 如何在没有新代码实施的情况下向我的*预安装*应用程序用户发送强制更新,例如 Gmail?
- java - 如何在 RecyclerView 适配器类中初始化正确的 TextView?
- javascript - 过滤谓词函数不返回任何内容并且无法读取属性“数据” - MatTableDataSource 角度
- javascript - 如何在数组中调用对象
- c# - 如何删除 MediaPlayer/SMTC 类的默认媒体按钮?C# UWP
- python - 使用 Raspberry Pi 启动时无法运行文件