当你将(fwrite)写入二进制文件时,为什么fseek会工作,但是当读取(fread)时它不会? - C

时间:2017-02-20 14:03:56

标签: c binary fwrite fread fseek

基本上我的问题是当我使用以下程序时:

#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。
  4. 这种方式有效,但第一个程序似乎没有改变任何东西,它再次显示完全相同的数字。

    #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;
    }
    

1 个答案:

答案 0 :(得分:3)

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

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