为什么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; 
} 

它根本不会改变任何东西。万一你在哪里知道,要检查的第一个程序的工作我做的事是:

  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。 –

第一for循环读取文件中的每个数字为r打印前。在循环结束时,r包含文件中的最后一个数字,并将其写入您寻找的位置。

要么在循环中使用不同的变量,要么在循环后面放置r = 11;赋值。

+0

哦,我不相信我犯了这个错误,感谢一百万 –