为什么 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;
}
它根本没有改变任何东西。以防万一你想知道,检查第一个程序是否工作我所做的是:
- 我会运行你在本文下面的程序来检查存储在二进制文件中的整数。
- 我会 运行 你在本文顶部的程序(我发布的第二个)将第 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;
}
第一个 for
循环将文件中的每个数字读入 r
,然后再打印它们。在循环结束时,r
包含文件中的最后一个数字,并将其写入您查找的位置。
要么在循环中使用不同的变量,要么在循环之后放置 r = 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;
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;
}
第一个 for
循环将文件中的每个数字读入 r
,然后再打印它们。在循环结束时,r
包含文件中的最后一个数字,并将其写入您查找的位置。
要么在循环中使用不同的变量,要么在循环之后放置 r = 11;
赋值。