为什么fseek在写入(fwrite)到二进制文件时工作,但在读取(fread)时没有? - ç
问题描述:
基本上我的问题是,当我使用下列程序:为什么fseek在写入(fwrite)到二进制文件时工作,但在读取(fread)时没有? - ç
#include <stdlib.h>
#include <stdio.h>
#define SIZE 1000
int main() {
FILE *fp;
int r, i;
char fp_string[600] = "/Users/mac/Library/Mobile Documents/com~apple~CloudDocs/College/Program With Persistent Data/Lab 3/num1000.bin";
fp = fopen(fp_string, "rb+");
r = 11;
fseek(fp, 3 * sizeof(int), SEEK_SET);
fwrite(&r, sizeof(int), 1, fp);
fseek(fp, 10 * sizeof(int), SEEK_SET);
fwrite(&r, sizeof(int), 1, fp);
fclose(fp);
return 0;
}
它更新的二进制文件(这是1000点的整数)与第3和第10位是11
但是,当我做了以下操作:
#include <stdlib.h>
#include <stdio.h>
#define SIZE 1000
int main() {
FILE *fp;
int r, i;
char fp_string[600] = "/Users/mac/Library/Mobile Documents/com~apple~CloudDocs/College/Program With Persistent Data/Lab 3/num1000.bin";
fp = fopen(fp_string, "rb+");
r = 11;
printf("\n\n Before making any changes:\n");
for (i = 0; i < SIZE; i++) {
fseek(fp, i * sizeof(int), SEEK_SET);
fread(&r, sizeof(int), 1, fp);
printf("%d ", r);
}
fseek(fp, 3 * sizeof(int), SEEK_SET);
fwrite(&r, sizeof(int), 1, fp);
fseek(fp, 10 * sizeof(int), SEEK_SET);
fwrite(&r, sizeof(int), 1, fp);
printf("\n\n After making changes:\n");
fseek(fp, 0, SEEK_SET);
for (i = 0; i < SIZE; i++) {
fread(&r, sizeof(int), 1, fp);
printf("%d ", r);
}
fclose(fp);
return 0;
}
它根本不会改变任何东西。万一你在哪里知道,要检查的第一个程序的工作我做的事是:
- 我会跑,你有这样的文字来检查存储在二进制文件整数下面的程序。
- 我会运行你已经在这个文本之上的程序(我发布的第二个)将第3个和第10个整数更改为11.
- 我会运行你在下面的程序来检查那些整数是否被改变到11.
这样,它的工作,但第一个程序似乎并没有改变任何东西,它再次显示完全相同的数字。
#include <stdlib.h>
#include <stdio.h>
#define SIZE 1000
int main() {
FILE *fp;
int r, i;
char fp_string[600] = "/Users/mac/Library/Mobile Documents/com~apple~CloudDocs/College/Program With Persistent Data/Lab 3/num1000.bin";
fp = fopen(fp_string, "rb");
for (i=0;i<SIZE;i++) {
fread(&r, sizeof(int), 1, fp);
printf("%d ", r);
}
fclose(fp);
return 0;
}
答
第一for
循环读取文件中的每个数字为r
打印前。在循环结束时,r
包含文件中的最后一个数字,并将其写入您寻找的位置。
要么在循环中使用不同的变量,要么在循环后面放置r = 11;
赋值。
+0
哦,我不相信我犯了这个错误,感谢一百万 –
也许在写入文件后试图'fflush'文件(这些操作是_buffered_) –
@ Jean-FrançoisFabre我认为'fseek()'会自动刷新。 – Barmar
该程序的功能如预期:它写你要求它写和在正确的地方。但是如果你写的价值与以前相同,没有什么会改变。只需在写入之前添加'r = 13;'行,您将在第二个列表中看到13。 –