2017-02-20 5 views
1

в основном моя проблема заключается в том, что, когда я использую следующую программу:Почему 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; 
} 

Это ничего не меняет. Только в случае, если вы где интересно, чтобы проверить, если первая программа работала, что я сделал это:

  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 во втором списке. –

ответ

3

Первый for цикл читает каждое число в файле в r перед печатью. В конце цикла r содержит последнее число в файле и записывается в места, где вы ищете.

Либо использовать другую переменную в цикле, либо поставить назначение r = 11; после цикла.

+0

О, я не могу поверить, что я совершил эту ошибку, благодаря миллиону –

Смежные вопросы