2010-05-09 69 views
0

我目前正在做一項任務,這讓我堅持了幾個小時。有人能幫我指出爲什麼這不適合我嗎?如何從一個文件讀入一個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); 
} 

我得到的編譯

沒有錯誤或警告應該打印文件的內容,就像它是在文件中。 像這樣:

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 

但是當我運行它,它輸出這樣的:提前

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 

謝謝你,你是一個生命的救星

回答

3

我覺得你的問題是,你的領域包含空格。 fscanf將在看到空格字符時停止掃描字符串(%s)。您需要更改您的%s格式說明符以允許包含空格。您可以排除您的分隔符,例如%[^;]或指定要包含的字符,例如%[ a-zA-Z0-9-](我想我可能會選擇第一個選項)。

% man fscanf

+1

那巨大的甚至沒有想到的是:/感謝:d – 2010-05-09 09:44:39

3

不是原因,但在你的PrintBookList方法,你有

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

,但你不能得到結構的數組這種方式(它返回4,尺寸的大小的指針)。

這是標準的做法,通過大小:

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

謝謝你的提示,固定:) – 2010-05-09 09:31:37

0

不要忘了限制讀串的大小(不要忘記,他們最終用「\ 0」符號)(scanf函數沒有按」不知道這些字段有多長)。

的scanf(「%24 [^;] ...