文件中的某些信息未被读取

时间:2017-03-17 23:51:12

标签: c

我正在将此课程作为我计算机科学课程考试成绩的一部分。由于某种原因,第一次在循环中读取文件时,只读取标题和序列号,但不将信息存储在其他变量中。

这是文件数据

pass
qwerty
ef frgr
math
5454
1234

awesome
qazxc
fue fr
math
4354
1234

代码:

int retrieveBooks(book bookList[])
{


    int amt=0, readRes;
    FILE *bookFile;

    bookFile=fopen("Book_List.txt", "r");

    if (bookFile==NULL)
        printf("Book file not available\n\n");
    else{
        readRes=fscanf(bookFile,"%[^\n]s", bookList[amt].title); 

        while(readRes>0){
            fscanf(bookFile,"%s", bookList[amt].serialNum);
            fscanf(bookFile,"%[^\n]s", bookList[amt].author);
            fscanf(bookFile,"%[^\n]s", bookList[amt].subject);
            fscanf(bookFile,"%i", &bookList[amt].price);
            fscanf(bookFile,"%i", &bookList[amt].ownerID);

            ++amt;
            readRes=fscanf(bookFile,"%[^\n]s", bookList[amt].title);
        }// end while

        fclose(bookFile);
    }// end else

    return amt;
}// end retrieveBooks

1 个答案:

答案 0 :(得分:2)

如果您想使用fscanf()读取一行,则语法为

readRes=fscanf(bookFile,"%[^\n]", bookList[amt].title);

s之后不应该%[^\n],它会在文件中查找文字s,因为%[^\n]一直在阅读,所以永远不会找到它下一个字符是换行符,因此下一个字符显然不会是s。我猜您认为[^\n]%s格式的某种修饰符,但它们完全分开。

此外,在您阅读这样的行之后,您应该阅读下一个字符以跳过换行符。否则,使用此模式对fscanf()的下一次调用将只读取一个空字符串,因为它在同一换行符处停止。您只需在每个格式字符串的开头放置一个空格即可首先跳过空格。

所以代码应该是:

    readRes=fscanf(bookFile,"%[^\n]", bookList[amt].title); 

    while(readRes>0){
        fscanf(bookFile," %s", bookList[amt].serialNum);
        fscanf(bookFile," %[^\n]", bookList[amt].author);
        fscanf(bookFile," %[^\n]", bookList[amt].subject);
        fscanf(bookFile," %i", &bookList[amt].price);
        fscanf(bookFile," %i", &bookList[amt].ownerID);

        ++amt;
        readRes=fscanf(bookFile," %[^\n]", bookList[amt].title);
    }// end while

或者,您可以使用fgets()阅读每一行,然后在必要时使用sscanf()将其解析为数字。