1
基本上我的問題是,當我使用下列程序:爲什麼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;
}
也許在寫入文件後試圖'fflush'文件(這些操作是_buffered_) –
@ Jean-FrançoisFabre我認爲'fseek()'會自動刷新。 – Barmar
該程序的功能如預期:它寫你要求它寫和在正確的地方。但是如果你寫的價值與以前相同,沒有什麼會改變。只需在寫入之前添加'r = 13;'行,您將在第二個列表中看到13。 –