开发者

How do you read from a file into an array of struct?

I'm currently working on an assignment and this have had me stuck for hours. Can someone please help me point out why this isn't working for me?


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].subj开发者_如何学Cect, 
        &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);
}

I get no errors or warnings on compile

it should print the content of the file, just like it is in the file. Like this:

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

but when I run it, it outputs this:

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  

Thanks in advance, you're a life saver


I think your problem is that your fields contain spaces. fscanf will stop scanning a string (%s) when it sees a white space character. You need to change your %s format specifiers to allow spaces to be included. You can either just exclude your delimiter, e.g. %[^;] or specify what characters to include, e.g. %[ a-zA-Z0-9-] (I think I'd probably go for the first option).

% man fscanf


Not the cause, but in your PrintBookList method, you have

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

but you can't get the size of an array of structs that way (it returns 4, the size of a pointer).

It is standard practice to pass the size in:

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


Don't forget to limit size of read strings (don't forget they end with a '\0' symbol) (scanf doesn't know how long the fields are).

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜