test.c 扫描 file.txt 并打印给定ID的名称。
我想在file.txt中添加第3列
我也想问:
-vf
和%99s
的含义是:
== 2
file.txt(已添加新列)
while (fscanf(fff, "%d %99s", &id, name) == 2) {
test.c已修改为使用第3列(添加了char name2 [100];并且克隆了%99s)
结果:无效。 (编译:确定。但输出空(无))
1 name1 newcolumn1
2 name2 newcolumn2
3 name3 newcolumn3
答案 0 :(得分:0)
必须是:while (fscanf(fff, "%d %99s %99s ", &id, name, name2) == 3) { ... }
,请注意== 3
。
来自manpage of fscanf():
这些函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。
另请注意,您的文件位于Linux根文件夹:/file.txt
。你的意思是当前工作目录只有file.txt
吗?
%99s
表示fscanf将读取99个字符并添加一个终止NUL字符('\0'
),这样您的缓冲区就不会溢出,因为它的大小为100。
此外,如果您希望始终通过%s
向fscanf提供正确的缓冲区,则可以关注this explanation。
答案 1 :(得分:0)
fscanf(fff, "%d %99s %99s", &id, name) == 2
表示该程序必须只接受名称和名称2中的最多99个字符。
现在fscanf返回一个int值,该值为输入接受并放入变量中。所以#include <stdio.h>
int main(void)
{
char name[100];
char name2[100];
FILE *fff;
int found = 0;
int id;
fff = fopen("/file.txt", "r");
if (fff == NULL)
return -1;
while ( fscanf(fff, "%d %99s %99s ", &id, name, name2) == 3 )
{
if (id == 2)
{
printf("%s\n", name2);
found = 1;
break;
}
}
fclose(fff);
return 0;
}
总是错误的,因为接受了3个输入。
fscanf condtion只是一个小心谨慎的安全措施(常见的习惯用法)。
现在正确的程序是:
export