您好我需要更好地解释fscanf参数。 我有以下文本文件
this is line 1
this is line 2
this is line 3
...
宣读
for(int i=0;i<2;++i){
test[255];
fscanf(fp,"%[\n]",test);
printf("%s\n",test);
}
now I get:
this is line 1
this is line 1
with "%[^\n]\n"
I get
this is line 1
this is line 2
现在我根据我的理解打破了我的陈述: %表示读取未格式化(%s会给我一个字符串%c单个字符......) [^ \ n]直到你得到的东西在这种情况下不符合新行
你能否更好地解释一下方括号的功能和终止。我阅读了官方解释,但完全不理解。
扩展名1:我的问题。 我知道有更多易于使用的选项来实现我的目标。但我只是试着理解fscanf的语法。
扩展名2: 当我理解正确的时候
fscanf(fp,"%[^\n]%*c",test)
读取直到换行符并跳过下一个换行符。 遵循这个逻辑%[^ \ n]将是除换行符之外的每个字符。我可以写
for(int i=0;i<2;++i){
test[255];
fscanf(fp,"%[a-z]",test);
printf("%s\n",test);
}
我希望得到
this
is
但是我得到了
ٷ�
ٷ�
扩展名3 问题不重复 scanf() leaves the new line char in the buffer 因为我想阅读完整的一行
答案 0 :(得分:2)
使用scanf
系列函数可以计算输入流中剩余的内容。格式说明符%[^\n]
使用字符类(不是'\n'
)来读取换行符 - 允许使用空格输入字符串。 字符类(例如[...]
)与括号内的内容匹配,'^'
作为字符类中的第一个字符反转匹配。转换完成后,'\n'
行结尾将保留在输入缓冲区中。
由于字符串转换在遇到换行符时结束,而没有删除保留在输入缓冲区中的'\n'
,因此下一次读取尝试将终止,而不会读取任何字符(输入失败),{的值{1}}保持不变(保持第一行的值),所以当你再次打印它时,你会得到同样的东西。
来自test
man 3 scanf
当您更改格式字符串以包含换行符(s Matches a sequence of non-white-space characters; ... The input string stops
at white space or at the maximum field width, whichever occurs first.
[ Matches a nonempty sequence of characters from the specified set of accepted
characters; ... The usual skip of leading white space is suppressed.
)时,您只需删除剩余的换行符。因此,您下次尝试阅读时会看到第二行的第一个字符并且读取正确。您还可以使用"%[^\n]\n"
使用"%[^\n]%*c"
(赋值抑制运算符)来读取并丢弃字符类之后的下一个字符。
这个陷阱(未考虑保留在输入缓冲区中的字符)是鼓励新C程序员使用'*'
(或POSIX fgets
)进行面向行的输入的主要原因之一因为这两个函数都会在它们填充的缓冲区中读取(并包含)换行符 - 消除了将其保留为未读的可能性 - 只是等待下次读取时出现问题。