【发布时间】:2015-10-19 03:06:07
【问题描述】:
我遇到了一个奇怪的情况。我使用 Dev C++ 编写了以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
FILE *fp; // edited -- wrong type at first (File)
unsigned char a, b;
int c, count, res; // added "res"
short int d;
fp = fopen("record.dat", "r");
fseek(fp, SEEK_SET, 0);
count = 0; // edited -- wrong variable name at first
res = fread(&a, 1, 1, fp);
printf("a res = %d, errno %d\n", res, errno);
while(count < 10) {
count++;
res = fread(&b, 1, 1, fp); // added "res =" as mentioned in comment
printf("b res = %d, errno %d\n", res, errno);
res = fread(&c, 4, 1, fp); // added "res =" as mentioned in
printf("c res = %d, errno %d\n", res, errno);
res = fread(&d, 2, 1, fp); // added "res =" as mentioned in
printf("d res = %d, errno %d\n", res, errno);
res = fread(&a, 1, 1, fp); // ** where problem starts
printf("a res = %d, errno %d\n", res, errno);
}
fclose(fp);
}
“record.dat”文件大小超过 1MB,所以我想上面的程序可以毫无问题地获取前 10 条记录的数据(例如,无需处理 EOF 问题)。但是,当我在Dev C++中编译并运行程序时,读取4条记录后,fread()(上面用**标记)返回0,然后while循环内的后续fread()也返回0,表示没有数据可以阅读。奇怪的是所有errno都是0,而当我在Linux中使用g++编译器编译同一个程序时,程序可以毫无问题地读取同一个文件中的所有(不仅仅是10条)记录。
有什么我错过的吗?谢谢!
【问题讨论】:
-
如果这是您的确切代码,那么您在大多数
fread()s 之前缺少res =,这使得跟随它们的printf()s 可能具有误导性。 -
这是 C 代码:为什么是 c++ 标签?
-
您是否尝试过以二进制模式 ("rb") 打开以防 c 或 d 包含等效的 EOF 标记?
-
@Christophe 感谢您更改标签。 “rb”是修复,我将fopen()中的参数从“r”更改为“rb”,删除原来的可执行文件然后重新编译,它解决了问题!非常感谢!
-
@melpomene:如果 OP 麻烦修改 Dev-C++ 的选项来调用 C 编译器,他没有提及。此外,他的控制是“Linux 中的 g++ 编译器”,他标记了问题c++。对我来说似乎是一个非常安全的赌注。
标签: c++ fopen fread dev-c++ errno