2016-03-26 4 views
-2

Le programme que je réalise utilise la redirection io pour lire un fichier ligne par ligne, chaque ligne étant un enregistrement dans une liste. J'ai besoin d'imprimer une liste de structure, mais je suis incapable de le faire à moins que ce soit à l'intérieur d'une boucle. Il a précédemment travaillé en utilisant une boucle for avec (i = 0, i (lessthan) list.nused; i ++) mais quand je le fais, rien ne s'imprime et il n'y a pas d'erreur. Toute aide serait géniale, merci. Voici une partie du code:C - Impossible d'imprimer la structure en dehors de la boucle while

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

#define NAMESIZE 20 
#define BLOCK 2 
#define BUFSIZE 512 

typedef struct { 
    char last[NAMESIZE]; 
    char first[NAMESIZE]; 
} name; 
typedef struct { 
    name name; 
    int score; 
} record; 
typedef struct { 
    record **data; 
    size_t nalloc; 
    size_t nused; 
} record_list; 
void list_init(record_list *list) { 
    list->data = NULL; 
    list->nalloc = list->nused = 0; 
} 
int make_list (record_list *list) { 
    int score; 
    size_t i; 
    char line[BUFSIZE]; 
    char fname[NAMESIZE]; 
    char lname[NAMESIZE]; 
    while (fgets(line, BUFSIZE, stdin) != NULL) { 
     if (list->nalloc == list->nused) { 
      record *rec = realloc(list->data, (list->nalloc+BLOCK)*sizeof(record)); 
      if (rec == 0) { 
       fprintf(stderr, "Unable to resize."); 
       clearerr(stderr); 
       return 1; 
      } 
      list->data = &rec; 
      list->nalloc += BLOCK; 
     } 
     if (fgets(line, BUFSIZE, stdin) == NULL) { 
      clearerr(stdin); 
      return 1; 
     } 
     sscanf(line, "%s %s %d", fname, lname, &score); 
     strcpy(list->data[list->nused]->name.first, fname); 
     strcpy(list->data[list->nused]->name.last, lname); 
     list->data[list->nused]->score = score; 
     list->nused = list->nused++; 
     //here is where it is able to print 
     //printf("%s\n", list->data[list->nused]->name.last); 
    } 
    //I would like it to print everything here 
    for (i = 0; i < list->nused; i++) { 
     printf("%s, %s: %d\n", list->data[i]->name.last, 
     list->data[i]->name.first, list->data[i]->score); 
    } 
    return 1; 
} 
int main(int argc, char *argv[]) { 
    record_list list; 
    list_init(&list); 
    make_list(&list); 
} 
+2

Voulez-vous que votre code soit compilé? 'list.nused' est invalide car' list' est un pointeur. Il doit donc être 'list-> nused'. De même pour certains autres accès aux champs 'list'. Donc, clairement, vous n'avez pas compilé votre code ou ce n'est pas la bonne version du code. – kaylum

+0

@kaylum désolé, devrait compiler maintenant – Bobbis

+0

"Devrait" compiler ?? Avez-vous réellement essayé? C'est toujours faux et ne compilera pas. On dirait que vous ne prenez même pas la peine de compiler et d'exécuter votre code. Alors, comment pouvons-nous faire confiance au comportement supposé que vous avez décrit? – kaylum

Répondre

2

Vous avez fait quelques petites erreurs. Tout d'abord, changer la définition de record_list à:

typedef struct { 
    record *data; 
    size_t nalloc; 
    size_t nused; 
} record_list; 

Vous redimensionnez un bloc de mémoire qui contiendra un certain nombre d'objets record de sorte que vous devriez avoir un pointeur à un enregistrement au lieu d'un pointeur vers un pointeur - utilisation ce dernier si vous voulez gérer un tableau redimensionnable de pointeurs. Cela nécessite quelques autres changements:

  • l'affectation après l'appel realloc DEVIENT list->data = rec
  • votre affectation des données d'enregistrement utilise l'accès des membres (.) au lieu de membre d'un accès pointeur (->) - dans d'autres mots, list->data[list->nused].name.first au lieu de list->data[list->nused]->name.first

Une autre erreur subtile est que list->nused = list->nused++ est tout simplement faux. Il devrait être list->nused++ ou list->nused += 1.

L'erreur finale est que vous lisez chaque ligne deux fois. Vous pouvez supprimer le second appel à fgets.

Vous devez également libérer la mémoire que vous allouez. Ajouter free(list.data) à la fin de la main.