2010-05-09 3 views
0

Je travaille actuellement sur un devoir et cela m'a eu bloqué pendant des heures. Quelqu'un peut-il m'aider s'il vous plaît expliquer pourquoi cela ne fonctionne pas pour moi?Comment lisez-vous un fichier dans un tableau de struct?


struct book 
{ 
    char title[25]; 
    char author[50]; 
    char subject[20]; 
    int callNumber; 
    char publisher[250]; 
    char publishDate[11]; 
    char location[20]; 
    char status[11]; 
    char type[12]; 
    int circulationPeriod; 
    int costOfBook; 
}; 

void PrintBookList(struct book **bookList) 
{ 
    int i; 
    for(i = 0; i < sizeof(bookList); i++) 
    { 
    struct book newBook = *bookList[i]; 
    printf("%s;%s;%s;%d;%s;%s;%s;%s;%s;%d;%d\n",newBook.title, newBook.author, newBook.subject, 
     newBook.callNumber,newBook.publisher, newBook.publishDate, newBook.location, newBook.status, 
     newBook.type,newBook.circulationPeriod, newBook.costOfBook); 

    } 
} 

void GetBookList(struct book** bookList) 
{ 
    FILE* file = fopen("book.txt", "r"); 
    struct book newBook[1024]; 
    int i = 0; 

    while(fscanf(file, "%s;%s;%s;%d;%s;%s;%s;%s;%s;%d;%d", 
     &newBook[i].title, &newBook[i].author, &newBook[i].subject, 
     &newBook[i].callNumber,&newBook[i].publisher, &newBook[i].publishDate, 
     &newBook[i].location, &newBook[i].status, 
     &newBook[i].type,&newBook[i].circulationPeriod, &newBook[i].costOfBook) != EOF) 
    { 
    bookList[i] = &newBook[i]; 
    i++; 
    } 

    /*while(fscanf(file, "%s;%s;%s;%d;%s;%s;%s;%s;%s;%d;%d", 
    &bookList[i].title, &bookList[i].author, &bookList[i].subject, 
    &bookList[i].callNumber, &bookList[i].publisher, &bookList[i].publishDate, 
    &bookList[i].location, &bookList[i].status, &bookList[i].type, 
    &bookList[i].circulationPeriod, &bookList[i].costOfBook) != EOF) 
    { 
    i++; 
    }*/ 

    PrintBookList(bookList); 

    fclose(file); 
} 

int main() 
{ 
    struct book *bookList[1024]; 
    GetBookList(bookList); 
} 

Je reçois aucune erreur ou des avertissements sur la compilation

il faut imprimer le contenu du fichier, tout comme il est dans le fichier. Comme ceci:

OperatingSystems Internals and Design principles;William.S;IT;741012759;Upper Saddle River;2009;QA7676063;Available;circulation;3;11200 
Communication skills handbook;Summers.J;Accounting;771239216;Milton;2010;BF637C451;Available;circulation;3;7900 
Business marketing management:B2B;Hutt.D;Management;741912319;Mason;2010;HF5415131;Available;circulation;3;1053 
Patient education rehabilitation;Dreeben.O;Education;745121511;Sudbury;2010;CF5671A98;Available;reference;0;6895 
Tomorrow's technology and you;Beekman.G;Science;764102174;Upper Saddle River;2009;QA76B41;Out;reserved;1;7825 
Property & security: selected essay;Cathy.S;Law;750131231;Rozelle;2010;D4A3C56;Available;reference;0;20075 
Introducing communication theory;Richard.W;IT;714789013;McGraw-Hill;2010;Q360W47;Available;circulation;3;12150 
Maths for computing and information technology;Giannasi.F;Mathematics;729890537;Longman;Scientific;1995;QA769M35G;Available;reference;0;13500 
Labor economics;George.J;Economics;715784761;McGraw-Hill;2010;HD4901B67;Available;circulation;3;7585 
Human physiology:from cells to systems;Sherwood.L;Physiology;707558936;Cengage Learning;2010;QP345S32;Out;circulation;3;11135 
bobs;thomas;IT;701000000;UC;1006;QA7548;Available;Circulation;7;5050 

mais quand je le lance, il affiche ceci:

OperatingSystems;;;0;;;;;;0;0 
Internals;;;0;;;;;;0;0 
and;;;0;;;;;;0;0 
Design;;;0;;;;;;0;0 
principles;William.S;IT;741012759;Upper;41012759;Upper;;0;;;;;;0;0 
Saddle;;;0;;;;;;0;0 
River;2009;QA7676063;Available;circulation;3;11200;lable;circulation;3;11200;;0;;;;;;0;0 
Communication;;;0;;;;;;0;0 

Merci à l'avance, vous êtes un épargnant la vie

Répondre

3

Je pense que votre problème est que vos champs contenir des espaces. fscanf arrête l'analyse d'une chaîne (%s) lorsqu'il voit un caractère espace blanc. Vous devez modifier les spécificateurs de format %s pour autoriser l'insertion d'espaces. Vous pouvez soit exclure votre délimiteur, par ex. %[^;] ou spécifiez les caractères à inclure, par ex. %[ a-zA-Z0-9-] (Je pense que j'irais probablement pour la première option).

% man fscanf

+1

Cest une grande N'a même pas penser que:/Merci: D –

3

pas la cause, mais dans votre méthode PrintBookList, vous avez

for(i = 0; i < sizeof(bookList); i++) 

mais vous ne pouvez pas obtenir la taille d'un tableau de struct de cette façon (il renvoie 4, la taille d'un pointeur).

Il est pratique courante de passer la taille en:

void PrintBookList(struct book **bookList, int numBooks) 
+0

Merci pour le conseil, fixe :) –

0

Ne pas oublier de limiter la taille des chaînes de lecture (ne pas oublier qu'ils se terminent par un « \ 0 » symbole) (scanf n » Je sais combien de temps les champs sont).

scanf ("% 24 [^;] ...

Questions connexes