为什么 fseek 在写入 (fwrite) 二进制文件时有效,但在读取 (fread) 时却无效? - C

Why does fseek work when you are writing (fwrite) to a binary file, but when reading (fread) it doesn't? - C

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

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

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

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