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。有人能告诉我为什么吗?