2010-02-02 5 views
3

J'ai beaucoup de données stockées au format bin comme une séquence de structures. Je veux être capable de lire aléatoirement l'une des structures et de le modifier en C. J'essaie avec le code suivant mais cela ne fonctionne pas. Quelqu'un peut-il le réparer pour moi s'il vous plaît?Modification des données du fichier .bin dans C

De même, serait-il possible de supprimer une structure intermédiaire du fichier entre?

Le code est ci-dessous:

#include <stdio.h> 
#include <stdlib.h> 

struct rec { 
     int x,y,z; 
}; 

void f_rite() 
{ 
     int i; 
     FILE *ptr_myfile; 
     struct rec my_record; 

     ptr_myfile=fopen("test.bin","w"); 

     for (i=0; i < 5; i++) { 
       my_record.x = i; 
       fwrite(&my_record, sizeof(struct rec), 1, ptr_myfile); 
     } 

     fclose(ptr_myfile); 

     return; 
} 


void f_read() 
{ 
     int i; 
     FILE *ptr_myfile; 
     struct rec my_record; 

     ptr_myfile=fopen("test.bin","r"); 

     for (i=1; i <= 5; i++) { 
       fread(&my_record,sizeof(struct rec),1,ptr_myfile); 
       printf("%d\n",my_record.x); 
     } 
     printf("\n"); 

     fclose(ptr_myfile); 

     return; 
} 

void f_rerite() 
{ 
     int i; 
     FILE *ptr_myfile; 
     struct rec my_record; 

     ptr_myfile=fopen("test.bin","rw"); 

     for (i=5; i >= 0; i--) { 
       fseek(ptr_myfile, sizeof(struct rec)*i, SEEK_SET); 
       fread(&my_record, sizeof(struct rec), 1, ptr_myfile); 
       my_record.x = my_record.x + 100; 
       fwrite(&my_record, sizeof(struct rec), 1, ptr_myfile); 
     } 

     fclose(ptr_myfile); 

     return; 
} 

int main() 
{ 
     f_rite(); 
     f_read(); 
     f_rerite(); 
     f_read(); 

     return 0; 
} 
+0

Vous devez faire 'fseek()' ou une opération équivalente chaque fois que vous passez de la lecture à l'écriture (ou de l'écriture à la lecture). Vous devez donc avoir deux opérations 'fseek()' par boucle. –

Répondre

3

Il n'y a pas d'indicateur "rw" à ouvrir. Vous avez besoin de "r +" pour lire et écrire (mise à jour). Comme il s'agit de données binaires, vous devriez utiliser "r + b", et "wb" dans votre fonction f_rite et "rb" dans votre fonction f_read. En outre:

  • Vérifiez la valeur de retour des appels qui pourraient échouer, vous découvrirez que par exemple. fwrite a échoué.
  • Votre f_rerite fonctionne à travers 6 éléments, vous êtes à côté d'un.
  • Votre f_rerite écrit également à l'élément suivant. Vous souhaitez probablement mettre à jour l'enregistrement en cours plutôt. Ce qui signifie que vous avez besoin de nouveau après avoir appelé Fread.
+0

OP ne dit pas quelle plate-forme il est, mais je pense que "rb" et "r + b" sont des extensions Microsoft qui ne s'appliqueront pas aux autres plateformes. –

+0

Je l'ai essayé sur RHEL 5.3 et ils fonctionnent comme l'a dit OB. :) – user203405

+1

les indicateurs 'b' sont standard C, bien que sur * nixes cela n'a généralement aucun effet car le système ne gère pas les fichiers binaires/texte différemment. – nos

2

"rw" est faux. Utilisez "r+". N'oublie pas de revenir après avoir lu.

+0

Merci beaucoup! :) Mais pourquoi est-ce que le retour est important? Même sans cela, il semble bien fonctionner? :( – user203405

+0

Sans le chercher, il serait en fait modifier la * prochaine * struct dans le fichier –

+0

Ok, je me trompais.Je viens de le corriger.Merci encore. :) – user203405