【问题标题】:Writing to a Binary file in C, interpreting output用 C 写入二进制文件,解释输出
【发布时间】:2016-09-20 23:40:42
【问题描述】:

我正在尝试用 c 测试写入二进制文件,只是想了解我的输出。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void writeToFile();

int main(void) {

    writeToFile();

    return(0);
}

void writeToFile() {
    FILE * file = fopen("file.bin","w");
    char * string;

    if(file == NULL)
        printf("Problem with file\n");

    string = malloc(sizeof(char)*6);

    strcpy(string,"Hello");

    fwrite(&string,sizeof(string),strlen(string)+1,file);

    fclose(file);

}

我正在使用命令解释我的结果:

od -c file.bin

显示八进制输出。 并给我这个:

0000000   @ 022   # 001  \0  \0  \0  \0 020 020   # 001  \0  \0  \0  \0                                                                                         
0000020 300 016 374   ? 377 177  \0  \0 264 006   @  \0  \0  \0  \0  \0                                                                                         
0000040   @  \a   @  \0  \0  \0  \0  \0 200 365   c 274 020 177  \0  \0                                                                                         
0000060

我不知道如何解释这个输出,我知道它是八进制的,但我怎么知道我的字符串“Hello”写得正确?

我在想我可以使用 ascii 表将输出转换为 ascii,但我不确定这是否可行?有没有一种简单的方法可以检查字符串“Hello”是否正确写入?

也许我可以读回输出,并以某种方式检查其中是否存在字符串“Hello”?

任何帮助将不胜感激。

【问题讨论】:

  • 您正在将“字符串”的地址传递给 fwrite。你应该传递它的值。
  • 以十六进制显示输出可能更容易(我使用od -Ax -t x1
  • 你正在写 指针 string(不是它指向的东西,它是字符串),以及一堆恰好在它后面的垃圾。
  • 如果您希望完全控制读取和写入的内容,您应该使用模式wb 而不是w 打开文件。仅将fopen()w 一起使用不适合二进制模式。

标签: c file binaryfiles


【解决方案1】:

线

 fwrite(&string,sizeof(string),strlen(string)+1,file);

应该是

 fwrite(string, strlen(string)+1, 1, file);

因为

  1. 您已经有一个指向该项目的指针 - 不需要指向该指针的指针 - 因此 string 而不是 &amp;string
  2. 项目大小为strlen(string) +
  3. 你有一件物品

这就是为什么你得到的输出没有意义,因为它是内存中的随机内容。

编辑

还有

if(file == NULL)
    printf("Problem with file\n");

应该是

if(file == NULL) {
    printf("Problem with file\n");
    return;
 }

因为在函数的其余部分中使用 null file 几乎无法完成

【讨论】:

  • 哦,好吧,如果我有一个带有 char * 的结构,我会用同样的方式写吗?还有第一列数字代表什么?
  • 如果您有struct,您需要以某种方式对其进行序列化(谷歌序列化)。为什么不阅读fwrite 的手册页来了解这些数字
  • 想链接一个关于 C 结构序列化的页面?自己用谷歌搜索似乎收效甚微。
【解决方案2】:

要以二进制形式写入文件,您应该使用“wb”选项来写入字节。

FILE * file = fopen("file.bin","wb");

至于知道文件是否正确写入,防弹的方法,(尽管它可能退出更好的方法)只是用“rb”读回文件并以正常格式打印。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2017-01-26
    • 2017-02-18
    相关资源
    最近更新 更多