![](/img/trans.png)
[英]Why can I not use fscanf() to read consecutive characters from a file?
[英]If I use fscanf to read a file, can I use it to store the number of characters it reads?
我正在尝试使用fscanf
从文件中读取一堆单词(全部在单独的行上),并且我想找到每个单词的长度。 fscanf
是否允许我这样做,或者如果没有,还有其他方法吗? 我一直在寻找关于“输入项成功匹配和分配”的解释,但这仍然有点令人困惑。
要查找扫描单词(或int
、 double
、...)的文本长度,请在说明符前后添加一对"%n"
。 "%n"
保存扫描偏移并且不影响scanf()
返回值。
int n1;
int n2;
char buff[100];
// v-------- space to consume leading white-space
while (scanf(" %n%99s%n", &n1, buff, &n2) == 1) {
printf("word <%s> length: %d\n", buff, n2 - n1);
}
如果项目是带有"%f"
的double
精度,带有"%d"
的int
,则上述工作同样有效,...。
对于"%s"
,可以在扫描后使用strlen()
找到字符串的长度。
char buff[100];
while (scanf("%99s", buff) == 1) {
printf("word <%s> length: %zu\n", buff, strlen(buff));
}
先进的
学究式地,输入可能包括嵌入的 null 字符。 Null 字符通常不会在文本文件中找到,除非是偶然(将 UTF-16 读取为 UTF-8)或恶意用户。 使用"%s"
,读取null 字符将被视为任何其他非空白字符。 因此, " %n%99s%n"
方法可能导致长度超过strlen()
。
我一直在寻找关于“输入项成功匹配和分配”的解释,但这仍然有点令人困惑。
scanf()
的返回值大致是匹配说明符的计数,而不是单词的长度。 如果扫描不完整,则返回值可能小于说明符的数量;如果第一次遇到文件结尾,则返回值可能小于EOF
。 "%n"
不计入此计数。 带有"*"
的说明符也没有贡献。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.