C程序读取文件的结尾

时间:2015-10-26 09:10:47

标签: c eof

请在本文末尾的编辑中查看 我有一个test.dat有2行。 在第一行是一个浮点数(5.0) 在第二行是两个整数,用"分隔。 *",例如4 * 3 正确显示浮点数(输出:5.0000),但未显示第二行。我的老师告诉我,我在while循环后犯了一个错误。 Fscanf读取文件的结尾,而不是开头。这就是为什么我将随机数作为输出,例如" 65746 * -8634364"我不知道,如何解决它。你的帮助会很好。这是我的C代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float z1;
    int z2,z3;
    char line[255];

    FILE *file;
    file = fopen("test.dat", "r");
    if (file==NULL)
    {
        printf("Error\n");
        return 1;
    }

    fscanf(file, "%f", &z1);
    printf("%f\n", z1);

    while (fscanf(file, "%s", line)  == 1)
    {
        fscanf(file, "%d*%d", &z2, &z3);
        printf("%d * %d\n", z2,z3);
    }
    fclose(file);
    return 0;
}

编辑:我按照第一个回答的说明后发出了新警告 警告代码:In function ‘main’: main.c:21:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[255]’ [-Wformat=] while (fscanf(file, "%s", &line) ==1) ^

编辑2:由于第一个答案,警告消失了!!还是一个问题:第二行的内容是&#34; 4 * 3&#34; ,我的输出是&#34; 0 * 0&#34;为什么呢?

2 个答案:

答案 0 :(得分:4)

while (fscanf(file, "%s", &line) != EOF)
                       ^ wrong argument is passed to %s

您将字符串读入line,但line被声明为char变量 -

char line;                 // will invoke UB if no space is left for '\0'

因此,您需要将line声明为char数组。有点像这样 -

char line[255];            //make sure to leave a space for null character

注意 - 可能不会针对fscanf测试EOF,请按如下方式编写循环条件 -

while (fscanf(file, "%s", line)==1)     //will return 1 only if it is successful
            /*           ^ note- don't pass here &line, just pass line  */

答案 1 :(得分:1)

使用fscanf填充char变量。您应该使用char *,因为您在格式字符串中使用%s。