为什么这个从文件到 read/write 整数数组的 C 代码不起作用?
Why does this C code to read/write array of integers from file not work?
我有以下 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
。但是,打印 b
不是 1, 2, 3, 4, 5
,而是输出 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);
得到了相同的结果。
有人知道我做错了什么吗?
您以只写方式打开文件,这意味着读取将失败。该程序在 fread
调用失败时打印垃圾,因此输出位置保持未初始化状态。最好检查 fread
的 return 值并采取适当的措施。
您可以使用 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 自行管理(并以二进制模式打开文件),或使用一些操作系统工具。
我有以下 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
。但是,打印 b
不是 1, 2, 3, 4, 5
,而是输出 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);
得到了相同的结果。
有人知道我做错了什么吗?
您以只写方式打开文件,这意味着读取将失败。该程序在 fread
调用失败时打印垃圾,因此输出位置保持未初始化状态。最好检查 fread
的 return 值并采取适当的措施。
您可以使用 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 自行管理(并以二进制模式打开文件),或使用一些操作系统工具。