这是我的代码,用于将数据从二进制文件加载到结构数组,但是我收到错误,找不到文件。文件在那里,它可以与其他功能一起使用。
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);
}
}
}
答案 0 :(得分:1)
您可能没有在环境中运行程序(特别是检查当前的working directory)。
当然你的fread
- 闻起来很糟糕。再次阅读standard C input/output函数的文档,尤其是fread。 sizeof(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
的失败;一个强大的程序应该处理它)
libsqlite
for sqlite)
不要忘记使用所有警告和调试信息编译代码(因此gcc -Wall -Wextra -g
与GCC)。阅读编译器的文档(例如invoke it的方法)和debugger的文档。使用调试器来了解程序的行为。