2017-02-20 52 views
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; 
} 

它根本不會改變任何東西。萬一你在哪裏知道,要檢查的第一個程序的工作我做的事是:

  1. 我會跑,你有這樣的文字來檢查存儲在二進制文件整數下面的程序。
  2. 我會運行你已經在這個文本之上的程序(我發佈的第二個)將第3個和第10個整數更改爲11.
  3. 我會運行你在下面的程序來檢查那些整數是否被改變到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; 
} 
+0

也許在寫入文件後試圖'fflush'文件(這些操作是_buffered_) –

+0

@ Jean-FrançoisFabre我認爲'fseek()'會自動刷新。 – Barmar

+0

該程序的功能如預期:它寫你要求它寫和在正確的地方。但是如果你寫的價值與以前相同,沒有什麼會改變。只需在寫入之前添加'r = 13;'行,您將在第二個列表中看到13。 –

回答

3

第一for循環讀取文件中的每個數字爲r打印前。在循環結束時,r包含文件中的最後一個數字,並將其寫入您尋找的位置。

要麼在循環中使用不同的變量,要麼在循環後面放置r = 11;賦值。

+0

哦,我不相信我犯了這個錯誤,感謝一百萬 –