1

我正在尝试使用 fscanf 读取文本文件。输入文件如下所示:

1
Test
0
32.1

除了作为随机值读取的第一个整数之外,所有内容都可以正常读取。

我的代码:

while((fgets(string,64,fp) != NULL)){
    fscanf(fp, "%i\n", &tid);
    fscanf(fp, "%s\n", name);
    fscanf(fp, "%d\n", &stat);
    fscanf(fp, "%f\n", &per);
    printf("%d %s %d %f", tid, name, stat, per);
    }

输出:

11281472 Test 0 32.0999982

有谁知道我做错了什么?

整个函数供参考:

Task *readData(Task *strt, char *fname){
    #ifdef DEBUG
        fprintf(stderr, "Entered Data import method\n");
    #endif
    char name[30];
    int tid, stat;
    float per;

    FILE *fp;
    fp= fopen(fname, "r");

    if(fgetc(fp) == EOF){
        printf("File is empty");
    }
    else{
    while(!feof(fp)){

        fscanf(fp, "%i\n", &tid);
        fscanf(fp, "%s\n", name);
        fscanf(fp, "%d\n", &stat);
        fscanf(fp, "%f\n", &per);
        printf("%d %s %d %f", tid, name, stat, per);
        strt = AddB(strt, tid, name, stat, per);
        }
    }
    return (strt);
}
4

2 回答 2

2

fgets读取(使用)输入文件中的第一个字符串,然后首先fscanf尝试将“Test”解析为“%i”格式并失败。

您可以feof在 while 循环中使用 as 条件,但是(感谢 John Bode)最好检查每个 fscanf 并使用标志或break.

每个fscanf返回一个值。如1所述:

返回值

成功完成后,这些函数将返回成功匹配和分配的输入项的数量;如果发生早期匹配失败,此数字可以为零。如果输入在第一次匹配失败或转换之前结束,则返回 EOF。如果发生读取错误,则设置流的错误指示符,返回 EOF,并设置 errno 以指示错误。

因此,您可能需要检查每个 fscanf 的返回值,以了解出现(读取)错误。

更新:您永远不应该使用 fgets/fgetc 来检查某些东西(不使用 倒带fseek或撤消ungetc),因为每个文件读取函数都会从文件中读取数据(文件中的当前位置将增加)。要检查错误,只需查看用于解析输入的常用 fscanf/其他函数的返回值。

于 2012-04-29T13:22:06.240 回答
0

您没有检查每个呼叫是否失败,因此您无法知道发生了什么。

(我对此进行了编辑以删除 %i 无效的断言,抱歉)

于 2012-04-29T13:23:35.380 回答