2013-06-30 2 views
0

У меня возникли проблемы с программой, которая использует fwrite и fread -> fread (void*, size_t, size_t, FILE*);, когда множество секунд size_t как любое число, отличное от нуля, не работает. Вот код; это не работает таким образом, если кто-то может помочь, я был бы признателен.Проблемы с fread и fwrite

P.S .: Если я подстановлю sc на функцию read и write, она работает, но не так, как ожидалось.

#include<stdio.h> 
#include<stdlib.h> 
#define TAM 10 
#define sc 5 

typedef struct str_score{ 
    float scr; 
    char nome[TAM]; 
}score; 

int main(){ 

    FILE *arq; 
    int x; 
    score a[sc], i={0.00,"-empty-"}; 

    if ((fopen("highscore.bin", "wb+"))==NULL){ 
     perror("Erro na abertura do arquivo\n"); 
     return 1; 
    } 

    fwrite(&i,sizeof(score), sc, arq); 

    fread(a ,sizeof(score), sc, arq); 

    for (x=0;x<sc;x++){ 
     printf("%s %.2f", a[x].nome,a[x].scr); 
    } 

    return 0; 

} 
+2

Это просто, что ваш компилятор наказывает вас за форматирование вашего кода, испуская багги код машины. –

+2

(Серьезно, отформатируйте/отпечатайте свой код и проверьте возвращаемое значение 'fread()' и 'fwrite()'.) –

ответ

2
  1. Поскольку i не является массивом, следующая строка не является правильным

    fwrite(&i,sizeof(score), sc, arq); 
    

    Это должно быть

    fwrite(&i,sizeof(score), 1, arq); 
    

    Вы можете написать sc количество элементов, только тогда, когда у вас есть инициализированный массив размером sc или больше.

  2. Вы не принимаете возвращаемое значение fopen. Измените fopen строку

    if ((arq = fopen("highscore.bin", "wb+"))==NULL){ 
    
  3. Между fwrite и fread, поставить

    fseek(arq, 0, SEEK_SET); 
    

Это сбрасывает указатель файла в начало файла, в котором вы начали писать.

+0

Спасибо за комментарий, он работает сейчас. Об "fwrite (& i, sizeof (оценка), sc, arq);", я хотел бы написать i для sc раз. Я заменил это для этого - для (x = 0; x user2536075

+0

'I hardt, что бы написать i для sc times.' - он на самом деле читает начиная с' & i' для 'sc * sizeof (i)' bytes - вот почему ваш 'fread', который делает подобную вещь, работает хорошо. – user93353