2017-05-20 1 views
0
typedef struct student 
{ 
    char name[10]; 
    int roll; 
    char subject[5]; 
    int mark; 
}STUDENT; 

J'utilise fwrite et fread pour stocker au-dessus de la structure dans le file.Now après le stockage dossier étudiant dans le fichier, je suis en train de modifier la structure comme ci-dessousfread() Replenish de fonctionnement données erronées dans la structure

typedef struct student 
{ 
    char name[10]; 

    char subject[5]; 
    int mark; 
}STUDENT; 

Maintenant je lis l'ancien disque que j'ai stocké plus tôt dans le dossier. J'utilise fread() pour faire cela.problème est les données n'ont pas été lues correctement du dossier dans le sujet et marquent le membre de données de la structure.

Répondre

0

Cela dépend de la façon dont vous lisez le fichier. Si vous fread dans la nouvelle structure utilisez sizeof(student), parce que "roll" est manquant, l'ancienne valeur de roulis est lue dans subject[5] dans la nouvelle structure. Vous pouvez utiliser fscanf pour charger la valeur dans chaque champ explicitement.

0

Cela est dû au fait que le fichier contient toujours les données dans l'ancienne structure. C'est un total de 10 + (+ 2) + 4 + 5 + (+ 3) +3 (+1) = 28 octets - les valeurs entre parenthèses sont le remplissage struct.

Lorsque vous faites fread dans une nouvelle struct à partir d'un fichier contenant des données dans l'ancien format, 4 octets de int roll; finiront par les 4 premiers octets de char subject[5];, en dernier 5ème élément de subject sera le premier octet du précédent subject. Une idée similaire s'applique au champ mark.

Si vous voulez lire et écrire des structures comme celle-ci - c'est-à-dire en en faisant une copie binaire - vous devez conserver l'ancien format, même s'il n'est plus utilisé. Une meilleure idée est d'utiliser une sorte de bibliothèque de sérialisation. Les "Protocol Buffers" de Google ne sont que l'un des nombreux exemples de ces bibliothèques, qui peuvent vous donner une idée de la façon dont ce genre de problèmes sont résolus.

+0

Merci, pouvez-vous s'il vous plaît fournir toute référence à commencer avec la bibliothèque de sérialisation, ce sera une aide précieuse. – user5979363

+0

@ user5979363 Dans le cas des tampons de protocole que j'ai mentionnés, vous pouvez trouver un bon tutoriel ici: https://developers.google.com/protocol-buffers/docs/cpptutorial –