这是我的代码。
#include<stdio.h>
struct element {
int value;
char activity;
};
typedef struct element element;
int main(int argc,char** argv) {
FILE* fp;
fp = fopen(argv[1], "r");
element a;
while(feof(fp) == 0) {
fscanf(fp, "%c %d", &a.activity, &a.value);
printf("\n%d", a.value);
}
}
现在,它两次输出文件中的每个整数..
我得到这个奇怪的回答?
我的结构是:
struct element {
int value;
char activity;
};
typedef struct element element;
我的输入文件是:
i 23
i 56
i 19
i 20
i 44
答案 0 :(得分:2)
查看您的fscanf
模式:
fscanf(fp, "%c,%d", &a.activity, &a.value);
然后以您的文件格式:
i 23
i 56
i 19
i 20
i 44
我没有看到任何逗号。请尝试使用空格,并确保将换行符考虑在内:
fscanf(fp, "%c %d\n", &a.activity, &a.value);
记住fscanf
不只是按顺序读取值,而是尊重通配符周围的固定字符。
编辑 - 同样重要,Keith在评论中指出:
请注意,在
\n
格式字符串中使用fscanf
可能会略有不同 误导。任何空白字符(包括\n
)都匹配为零或 更多的空白字符。因此,添加\n
适用于给定的 输入 - 但如果输入都在一行上,它也会起作用 由空格或制表符分隔:i 23 i 56 i 19 i 20 i 44
。如果你真的 想要面向行的输入,使用fgets()
(不是gets()
)来读取一行 一次进入一个字符串,然后sscanf()
来解析字符串。 (一切 但*scanf()
函数存在数字溢出问题。)
希望它有所帮助!
(PS:哦,我修复了你的代码格式。下次发帖时,请花一点时间确保代码看起来正确缩进和填充。看到一个混乱的代码片段有点带走了回答的愿望,你会在你的问题中获得更少的反馈!)
答案 1 :(得分:-1)
a.activity
第一次返回之前, fscanf
未初始化。在进行调试时,请记住这一点。大多数调试器会在第一行放置一个尚未执行的“游标”;因此,当fscanf
行第一次突出显示时,a.activity
尚未初始化,并且可能在其中有任何值。