我需要解释fscanf参数
您好我需要更好地解释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]直到你得到的东西在这种情况下不匹配新队
你能解释一下方括号的function和终止吗? 我阅读了官方解释,但没有完全理解。
扩展1:我的问题。 我知道有更多易于使用的选项来实现我的目标。 但我只是想了解fscanf的语法。
扩展2:当我理解正确的时候
fscanf(fp,"%[^\n]%*c",test)
读取直到换行并跳过下一个换行符。 遵循此逻辑,%[^ \ n]将是除换行符之外的每个字符。 我可以写
for(int i=0;i<2;++i){ test[255]; fscanf(fp,"%[az]",test); printf("%s\n",test); }
我希望得到
this is
但我明白了
ٷ ٷ
扩展3问题不重复scanf()将新行char留在缓冲区中,因为我想读取一个完整的行
使用scanf
系列函数可以解释输入流中剩余的内容。 格式说明符%[^\n]
使用字符类 (不是'\n'
)来读取换行符 – 允许使用空格输入字符串。 字符类 (例如[...]
)匹配括号内的字符, '^'
作为字符类中的第一个字符反转匹配 。 转换完成后, '\n'
行结束将保留在输入缓冲区中。
由于字符串转换在遇到换行符时结束,而不删除保留在输入缓冲区中的'\n'
,因此下一次读取尝试终止而不读取任何字符(输入失败), 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程序员使用fgets
(或POSIX getline
)进行面向行的输入的主要原因之一,因为这两个函数都读取(包括)他们填充的缓冲区中的换行符 – 消除了将其留下未读的可能性 – 只是等待下次读取时出现问题。