в основном моя проблема заключается в том, что, когда я использую следующую программу:Почему fseek работает, когда вы пишете (fwrite) в двоичный файл, но при чтении (fread) это не так? - 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;
}
Возможно, попробуйте 'fflush' файл после его записи (эти операции _buffered_) –
@ Jean-FrançoisFabre Я думаю, что' fseek() 'автоматически сбрасывается. – Barmar
Программа функционирует так, как ожидалось: она пишет то, что вы просите ее написать и в нужном месте. Но если значение, которое вы пишете, такое же, как и раньше, ничего не изменится. Просто добавьте строку 'r = 13;' непосредственно перед записью, и вы увидите 13 во втором списке. –