用于存储来自文件的数据的C中的Fscanf

时间:2011-09-26 19:09:14

标签: c scanf

这是我的代码。

#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

2 个答案:

答案 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尚未初始化,并且可能在其中有任何值。