我有以下C代码:
int a[5] = {1,2,3,4,5};
int b[5];
FILE *fp;
fp=fopen("test","w");
fwrite(a,sizeof(a),1,fp);
fread(b,sizeof(b),1,fp);
for (int i = 0; i < 5; i++) {
printf("%d ", b[i]);
}
printf("\n");
在这段代码中,我创建了一个数组a
,将其写入文件test
,然后尝试将其从文件中读取到b
中。但是,打印1, 2, 3, 4, 5
代替b
,输出1, 14, 0, 0, 0
。
我尝试更换
fwrite(a,sizeof(a),1,fp);
fread(b,sizeof(b),1,fp);
与
fwrite(a,sizeof(int),sizeof(a),fp);
fread(b,sizeof(int),sizeof(b),fp);
得到相同的结果。
有人知道我在做什么错吗?
答案 0 :(得分:1)
您已打开该文件仅用于写入,这意味着读取将失败。由于fread
调用失败,程序将打印垃圾,因此输出位置保持未初始化状态。最好检查fread
的返回值并采取适当的措施。
您可以使用r+
或w+
模式打开文件以进行读取和写入(两者相同,只是w+
将首先截断文件)。
由于您正在编写原始整数,因此您可能还需要二进制模式(默认是文本模式,这时流可以调整行尾并进行其他翻译)。
使用+
模式时,在写操作之后,如果不进行定位操作,则不允许阅读。因此代码可能是(伪代码):
fp=fopen("test","w+b");
fwrite(a,sizeof(a),1,fp);
rewind(fp); // same as seeking to the start
fread(b,sizeof(b),1,fp);
在标准C中,只有一个文件位置指示符,没有用于读取和写入的单独位置。要拥有单独的读取和写入位置,您需要使用fseek自己进行管理(并以二进制模式打开文件),或使用某些操作系统工具。