我无法正确读取二进制文件

时间:2017-05-18 16:39:54

标签: c file io binary

你好我有一个带有几个变量的结构,我尝试从二进制文件写入和读取它们但是当我读它们时我只看到奇怪的符号而且我不知道我搞砸了什么,我尝试了几个变种但它们都不起作用

    typedef struct catalog
    {
        char num[20];
        char name[80];
        char author[50];
        double price;
        int year;
        char publisher[80];
    } Catalog;

    Catalog* createCatalogData()
    {
        Catalog* c = malloc(sizeof(*c));
        if (!c)
        {
            // Ups... add error handling
            exit(0);
        }

        printf("Add num ");
        getString(&c->num);

        printf("Add name ");
        getString(&c->name);

        printf("add author ");
        getString(&c->author);

        printf("Add price ");
        if (scanf("%lf", &c->price) != 1)
        {
            // Ups... add error handling
            exit(0);
        }

        printf("Add publisher");
        getString(&c->publisher);

        printf("Add year");
        if (scanf("%d", &c->year) != 1)
        {
            // Ups... add error handling
            exit(0);
        }

        char *filePath = malloc(strlen(c->num) + 13);
        char *folderName = "Catalogs\\";
        strcpy(filePath, folderName);
        strcat(filePath, c->num);
        strcat(filePath, ".bin");

        FILE *file = fopen(filePath, "wb");
        if (file == NULL)
        {
            printf("Error opening file!\n");
            exit(1);
        }


        fwrite(&c->num,1, strlen(c->num), file);
        fwrite(&c->name,1, strlen(c->name), file);
        fwrite(&c->author,1, strlen(c->author), file);
        fwrite(&c->price, 1, sizeof(double), file);
        fwrite(&c->publisher,1, strlen(c->publisher), file);
        fwrite(&c->year,1, sizeof(int), file);

        fclose(file);

        return c;
    }

    Catalog* readCatalogData(char *filePath)
    {
        Catalog* c = malloc(sizeof(*c));


        FILE* fh;
        fopen_s(&fh, filePath, "rb");
        //check if file exists


        char *ptr;
        //read line by line
        const size_t line_size = 300;
        char* line = malloc(line_size);
        int counter = 0;
        char* date;

        fread(c->num, 1, 21, fh);
        fread(c->name, 1, 80, fh);
        fread(c->author, 1, 50, fh);
        fread(&c->price, 1, sizeof(double), fh);
        fread(c->publisher, 1, 80, fh);
        fread(c->year, 1, sizeof(int), fh);

        return c;
    }

1 个答案:

答案 0 :(得分:2)

当你这样做时。

fwrite(&c->num,1, strlen(c->num), file);

你写了一个可变数量的字节,没有任何终止符。当您读取文件时,您不知道实际读取了多少字节。

以上fwrite调用实际上包含另一个错误,因为您编写了指针,而不是c->num中的实际数据。

不是逐个编写数据成员,而是在一次调用中编写整个结构:

fwrite(c, sizeof c, 1, file);

阅读文件时,只需一次fread电话即可阅读整个结构。

重要说明(正如Attie在评论中所指出的):如果您打算使其成为可移植的,那么您应该使用serialization来读取和写入数据,因为结构的大小可能不是在所有平台上都一样。

对于简单的代码而言只是“试验”然后它会正常工作。