C - 印刷箱。文件奇怪的符号

时间:2016-08-20 21:07:03

标签: c

我创建了一个成功读取二进制文件的函数,但它不是我想要的打印。

功能:

void print_register() {

    FILE *fp;
    fp = fopen("data.bin", "rb");

    if (fp == NULL) {
        error_message("Fail to open data.bin for reading");
        exit(0);
    }

    reg buffer;

    while (EOF != feof(fp)) {
        fread(&buffer, sizeof(reg), 1, fp);
        printf("%s %d %d\n", buffer.name, buffer.age, buffer.id);
    }
    fclose(fp);
}

注意:regtypedef的{​​{1}}:

struct

撰写文件的功能:

typedef struct registers reg;
struct registers {
    char name[30];
    int age;
    int id;
    char end;
};

发布打印内容的打印屏幕更有帮助:

Console Image

正如你在图像上看到的那样," p" (打印命令)应该是结构的名称,年龄和id。

2 个答案:

答案 0 :(得分:3)

您的阅读循环不正确。不要使用feof(),它只能告诉您在读取尝试失败后到达文件末尾并且无论如何它可能都不会返回EOF,它只被指定为返回0或非0.请改用:

while (fread(&buffer, sizeof(reg), 1, fp) == 1) {
    printf("%s %d %d\n", buffer.name, buffer.age, buffer.id);
}

fread返回成功读取的项目数。在这里,您要求阅读1大小为sizeof(reg)的项目,如果该项目已成功阅读,fread将返回1,否则它将返回0(在达到读错误或文件结束的情况。)

您的屏幕截图显示了语法错误,您现在似乎已修复此问题。删除它,它没有帮助。

在你的函数register_new中,你正在为文件写一个未初始化的结构reg,难怪当你从文件中读回它时它没有任何有用的东西。对于它的价值,以二进制模式打开这个文件是正确的事情,因为它包含二进制数据,即结构的int成员。

传递给reg的{​​{1}}确实未初始化。 fwrite按值获取此未初始化结构的副本,并可能修改此副本,但这不会影响write_register中的本地结构。您应该修改register_new以获取指向结构的指针。与C ++不同,C中没有通过引用传递。

答案 1 :(得分:3)

register_new()中,您必须发送buffer地址才能让write_register()正常工作(现在您正在给它一份副本)缓冲区。)

替换: write_register(buffer); 有: write_register(&buffer);

然后更正write_register以使用地址而不是结构。

这可能有助于您了解正在发生的事情:http://fresh2refresh.com/c-programming/c-passing-struct-to-function