为什么fwrite在C中写入二进制文件时会打印空字节?

时间:2018-01-21 15:38:42

标签: c

#include <stdio.h>

struct my_struct {
    char text[100];
} e;

int main() {
    FILE *file;

    file = fopen("filename", "ab+");

    if (file == NULL) {
        file = fopen("filename", "wb+");
    }

    printf("Input text: ");

    fflush(stdin);
    gets(e.text);

    fwrite(&e, sizeof(e), 1, file);

    fclose(file);

    return 0;
}

我在这里要做的是创建一个二进制文件,并通过用户输入的文本来编写文件。代码工作正常!唯一的问题是该文件包含空格,我认为这是由于struct my_structure在编写文件时传递的fwrite数组大小。我找不到删除空格或替换fwrite的好方法。谢谢!回答这个问题。

节目输出:

Input text: holiday

文件输出:

686f 6c69 6461 7900 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 

1 个答案:

答案 0 :(得分:0)

您的代码中存在多个问题:

  • struct的大小是固定的,这解释了为什么输出文件中的字节数比使用的字节数多。

  • fflush(stdin);有未定义的行为,您不应该使用它。在输入流中没有 flush 字符挂起的标准方法,您可以将它们读取到换行符,但如果没有待处理的话,这可能会提示用户输入额外的输入。

  • 不推荐使用gets()函数。它无法安全调用,因为标准库无法确定要存储到目标数组中的最大字符数,因此无法阻止可能的缓冲区溢出。

以下是更正后的版本:

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

struct my_struct {
    char text[100];
} e;

int main() {
    FILE *file = fopen("filename", "ab");
    if (file == NULL) {
        file = fopen("filename", "wb");
    }
    if (file == NULL) {
        printf("Cannot open filename\n");
        return 1;
    }
    printf("Input text: ");
    if (fgets(e.text, sizeof e.text, stdin)) {
        /* strip the trailing newline if any */
        e.text[strcspn(e.text, "\n")] = '\0';
        /* write the bytes to the binary file */
        fwrite(e.text, strlen(e.text), 1, file);
    }
    fclose(file);
    return 0;
}

请注意,您可以使用简单的char数组而不是结构。