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

C 未读取文件中的某些信息,c,C,我正在做这个项目,作为我计算机科学课程考试成绩的一部分。出于某种原因,第一次在循环中读取文件时,只读取标题和序列号,但信息不会存储在其他变量中 这是文件数据 pass qwerty ef frgr math 5454 1234 awesome qazxc fue fr math 4354 1234 代码: 如果要读取带有fscanf()的行,语法为 readRes=fscanf(bookFile,"%[^\n]", bookList[amt].title); 在%[^\n]之后不应该有s在

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

这是文件数据

pass
qwerty
ef frgr
math
5454
1234

awesome
qazxc
fue fr
math
4354
1234
代码:


如果要读取带有
fscanf()
的行,语法为

readRes=fscanf(bookFile,"%[^\n]", bookList[amt].title);
%[^\n]
之后不应该有
s
在文件中查找文本
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()
将其解析为一个数字。

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

readRes=fscanf(bookFile,"%[^\n]", bookList[amt].title);
%[^\n]
之后不应该有
s
在文件中查找文本
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()
将其解析为一个数字。

而不是
,同时(readRes>0)
研究
fscanf()
的返回值,您可以得到一个更健壮的循环。不知道这些变量的类型或文件中的内容,几乎不可能知道发生了什么。请提供一个包含确切文件内容、预期行为和实际行为的列表。
fscanf
如果不限制正在读取的字符串的大小,可能会导致缓冲区溢出。您可能希望使用
fgets
+
sscanf
来限制字符串的长度。您不应该在
$[^\n]
之后使用
s
。而不是
while(readRes>0)
研究
fscanf()的返回值
您可以提出一个更健壮的循环。如果不知道这些变量是什么类型或文件中有什么,几乎不可能知道发生了什么。请提供一个包含确切文件内容的,预期行为和实际行为。
fscanf
如果对正在读取的字符串的大小没有限制,则可能导致缓冲区溢出。您可能希望使用
fgets
+
sscanf
,并限制字符串的长度。您不应该在
$[^\n]
之后使用
s
。感谢您的帮助!Barmar我照你说的做了,但是price和ownerID变量没有存储正确的值(可能是垃圾值),你接受了答案。这是不是意味着你解决了问题?是的,巴玛,问题解决了。出于某种原因,手表在调试期间显示了不正确的整数变量值:price和ownerID。有人能告诉我为什么吗?谢谢你的回答!Barmar我照你说的做了,但是price和ownerID变量没有存储正确的值(可能是垃圾值),你接受了答案。这是不是意味着你解决了问题?是的,巴玛,问题解决了。出于某种原因,手表在调试期间显示了不正确的整数变量值:price和ownerID。有人能告诉我为什么吗?