2010-12-01 3 views
-2

Une donnée de poubelle apparaît chaque fois que j'écris les données dans le fichier texte ... Pourquoi est-ce comme ça? Voici mon code ... Merciproblème malloc lors de l'écriture sur un fichier

int main(void) 
{ 
    unsigned int option = 0; 
    int i = 0; 
    } 
    getch(); 
    while(option != 5){ 
     option = display(); 
     switch(option){ 
      case 5: save(); 
        break;   
     } 
     for(i = 0; i < recordCtr; i++){ 
     free(array[i]);} 
    } 
} 

save(){ 
    FILE *stream = NULL; 
    stream = fopen("student.txt", "wt"); 
    printf("\nSaving the student list directory. Wait a moment please..."); 
      int i =0; 
       for (i=0; i<3; i++){ 
        fprintf(stream, "%5s %30s %5s\n", array[i]->studentID, array[i]->name, array[i]->course); 
       } 
    fclose(stream);      
} 
+1

Vous devez poster le plus petit code possible qui illustre le problème. Vous avez posté plusieurs pages. – Falmarri

+0

Essayez de réduire le problème à une situation particulière. Puis déboguez-le. – Tom

+2

En règle générale, si vous copiez et collez souvent des blocs de code, c'est généralement un signe que vous vous trompez. Pensez à écrire plus de fonctions ou à utiliser une boucle pour lire ou imprimer vos données d'étudiant. – dreamlax

Répondre

3

Il y a quelques bugs.

  1. recordCtr est toujours incrémenté. Si j'ai choisi d'ajouter 2 fois, vous remplissez array [0], array [1] et array [2]. Mais lorsque vous libérez de la mémoire, vous libérez la valeur recordCtr. Dans ce cas, vous pouvez libérer jusqu'à 6 enregistrements d'étudiants. Cela pourrait être un désastre.
  2. Dès que le commutateur se termine, vous libérez de la mémoire des dossiers des étudiants. Si l'utilisateur choisit de quitter, save() est appelé, ce qui tente de sauvegarder les enregistrements d'étudiants déjà libérés. Sa mauvaise idée de lire à partir de la mémoire libérée.

Quand est-ce que vous voyez des données parasites? Je veux dire sous quelle entrée?

+0

Merci .. j'ai résolu l'erreur ... heheheheh – newbie

0

Vous n'allouer de la mémoire pour struct student *array[MAX];

Je pense que c'est Surgraver vos données peut-être?

strcpy(array[0]->studentID, dummy);

idEtudiant est un char [5] et factice est un char [30]. Cela fait un moment que vous utilisez C pour m, mais vous pourriez casser vos autres données.

+0

Le tableau de pointeurs est correctement alloué avec une durée statique, et pour autant que je sache, il n'utilise que des pointeurs dans le tableau qui sont correctement alloués. –

Questions connexes