我正在将此课程作为我计算机科学课程考试成绩的一部分。由于某种原因,第一次在循环中读取文件时,只读取标题和序列号,但不将信息存储在其他变量中。
这是文件数据
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
答案 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()
将其解析为数字。