将数据从二进制文件加载到结构数组的函数

时间:2018-06-08 07:50:35

标签: c

这是我的代码,用于将数据从二进制文件加载到结构数组,但是我收到错误,找不到文件。文件在那里,它可以与其他功能一起使用。

void ispis2(void) {
    float data_num = brojanje();
    int N = data_num / 3;
    ARTIKL artikl[120];
    FILE *fp = NULL;
    fp = fopen("artikli.bin", "rb");
    if (fp == NULL) {
        fprintf(stderr, "Pogreska: %s\n", strerror(errno));
    }
    else {
        for (int i = 0; i < N; i++) {
            fread(&artikl[i].ime, sizeof(artikl), 1, fp);
            fread(&artikl[i].cijena, sizeof(artikl), 1, fp);
            fread(&artikl[i].ID, sizeof(artikl), 1, fp);
        }

        for (int i = 0; i < N; i++) {
            printf("Ime: %s", artikl[i].ime);
            printf("Cijena: %f", artikl[i].cijena);
            printf("ID: %d", artikl[i].ID);

        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可能没有在环境中运行程序(特别是检查当前的working directory)。

当然你的fread - 闻起来很糟糕。再次阅读standard C input/output函数的文档,尤其是freadsizeof(artikl)论证肯定是错误的(但由于你的问题不能解释ARTIKL到底是什么,我们无能为力。)

directory的概念在C11标准n1570中是未知的。另见this。但如果您使用的是POSIX系统,则可以使用getcwd(3)进行查询。其他操作系统有不同的查询方式(例如Windows上的GetCurrentDirectory)。阅读Operating Systems: Three Easy Pieces以了解有关操作系统的更多信息,并阅读一本优秀的C编程书。

所以你可以改进错误处理:

if (fp == NULL) {
    fprintf(stderr, "Pogreska: %s\n", strerror(errno));
    char wdbuf[128];
    memset(wdbuf, 0, sizeof(cwdbuf));
    fprintf(stderr, "working directory: %s\n", 
            getcwd(wdbuf, sizeof(wdbuf));
}

(上面的代码不会处理getcwd的失败;一个强大的程序应该处理它)

顺便说一下,我不确定像你这样处理二进制文件是否值得(二进制格式非常脆弱,你需要非常精确地记录它的格式;记住大多数时候,数据比处理它的应用程序更有价值。您可以考虑以某种文本格式(如JSONYAML,....)或某些sqlite数据库存储数据。考虑使用适当的库(例如jansson用于JSON,libsqlite for sqlite)

不要忘记使用所有警告和调试信息编译代码(因此gcc -Wall -Wextra -gGCC)。阅读编译器的文档(例如invoke it的方法)和debugger的文档。使用调试器来了解程序的行为。