2017-09-12 1 views
-1

J'ai un fichier d'exemple ci-dessous où je lis le binaire dans la structure et j'imprime la longueur de la chaîne qui est stockée dans la structure. Mais je reçois un défaut de segmentation sous-jacent lorsque j'essaie d'imprimer la chaîne complète. Je ne pouvais pas trouver la raison pour cela.Lecture d'un fichier binaire dans une variable de structure donnant une erreur de segment

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

struct sample { 
     unsigned int m; 
     unsigned int v; 
     unsigned int s[128]; 
     int t_length; 
     char *t; 
}; 

int main() 
{ 
     int i=0; 
     unsigned int t_len=0; 
     FILE *fp; 
     struct sample sam; 
     fp =fopen("sample.bin", "rb"); 
     if (fp==NULL) { 
       printf("File not created\n"); 
       return -1; 
     } 
     fread(&sam, sizeof(sam), 1, fp); 
     printf("t_length is %d\n", sam.t_length); 
     t_len=sam.t_length; 
     sam.t=(char *)malloc(sizeof(char) * t_len); 
     fseek(fp,0,SEEK_SET); 
     fread(&sam, sizeof(sam)+t_len, 1, fp); 
     printf("t_length is %d\n", t_len); 
     printf("%s\n", sam.t); 
     fclose(fp); 
     free(sam.t); 
     return 0; 

} 
+2

Vous présentez également le programme qui a créé le fichier binaire. – BLUEPIXY

+0

@BLUEPIXY Désolé je ne peux pas le donner – arceus

+2

Pourquoi avez-vous ajouté le tag C++? Est-ce que vous programmez en C ou en C++? Ce sont deux langues très différentes, alors s'il vous plaît éditez votre question pour enlever la balise de langue qui n'est pas pertinente (probablement la balise C++, puisque votre programme est un pur programme C). –

Répondre

3

Tenir compte des lignes suivantes:

fread(&sam, sizeof(sam), 1, fp); 
    // ... 
    sam.t=(char *)malloc(sizeof(char) * t_len); 
    // ... 
    fread(&sam, sizeof(sam)+t_len, 1, fp); 

Vous lisez la structure. Vous affectez le membre t. Ensuite, vous relisez la structure, en écrasant le membre t.

Cela conduira le membre t à ne plus pointer vers la mémoire que vous avez allouée, et conduira à undefined behavior lorsque vous déréférerez le pointeur.

Je vous suggère de faire quelques recherches sur flexible array members car cela pourrait résoudre votre problème. Cela nécessite bien entendu que le programme écrivant soit également modifié pour utiliser un membre de groupe flexible.

Si vous ne pouvez pas modifier le programme en écrivant le fichier, ne relisez pas la structure. Lire la structure une fois, allouer de la mémoire, puis lire seulement les données à mettre dans la mémoire que vous avez allouée. Passer la recherche, car le fichier devrait être à la bonne position de toute façon.


Dans le code quelque chose comme

fread(&sam, sizeof sam , 1, fp); 
sam.t = malloc(samr.t_length); 
fread(sam.t, sam.t_length, 1, fp); 
+0

Je ne pouvais pas comprendre. Pourriez-vous s'il vous plaît expliquer plus avec un exemple de programme. – arceus

+0

@arceus Ce que vous faites est à peu près équivalent à 'int a; a = 10; a = 5; 'et ensuite se demander pourquoi' a' n'est pas égal à '10'. Si vous parcourez le code, ligne par ligne, dans un débogueur, vous pouvez voir la valeur du changement de pointeur. –

+0

OK. Mais j'ai enlevé le premier fread et je suis toujours confronté à "Segmentation fault (core dumped)" – arceus