C编程:文件结束-操作

C编程:文件结束-操作,c,C,我试图检查,而不是结束文件在c编程 请任何人帮忙,我无法理解我在下面的代码中做错了什么。 它将最后一组行打印两次 /* Reads the Input file. */ fp = fopen("matrix_p2.txt","r"); if(fp == NULL) { printf("*** ERROR: Could not open file matrix_p2.txt\n"); } p = 2; while(!feof(fp)) { printf("n= %d, m= %d

我试图检查,而不是结束文件在c编程

请任何人帮忙,我无法理解我在下面的代码中做错了什么。 它将最后一组行打印两次

/* Reads the Input file. */
fp = fopen("matrix_p2.txt","r");
if(fp == NULL)
{
    printf("*** ERROR: Could not open file matrix_p2.txt\n");
}

p = 2;
while(!feof(fp))
{
    printf("n= %d, m= %d", n,m);

    for(i = n; i < N/p; i++)
        for(j = m; j < M; j++)
            fscanf(fp, "%d",&(A[i][j]));

    print_blk(A, n, m, N/p, M);
    //n = n + N/p;

    size[0] = N;
    size[1] = M;
}

fclose(fp);
输入:

1234 2 3 4 5 3 4 5 6 4 5 6 7

输出:

1234 2 3 4 5

3 4 5 6 4 5 6 7

3 4 5 6 4 5 6 7

但我希望输出如下:

输出

1234 2 3 4 5

3 4 5 6 4 5 6 7

这就是feof的工作原理;它不会告诉您是否即将到达文件末尾,它会告诉您是否已到达文件末尾。也就是说:它不会告诉你什么时候读过最后一个字符;它告诉你什么时候读过最后一个字符。最简单的解决方案是改变这一点:

        while(!feof(fp))
为此:

        while(1)
            for(i = n; i < N/p; i++)
                for(j = m; j < M; j++)
                    fscanf(fp, "%d",&(A[i][j]));
            if(feof(fp))
                break; // hit end-of-file while getting the array
这是:

            for(i = n; i < N/p; i++)
                for(j = m; j < M; j++)
                    fscanf(fp, "%d",&(A[i][j]));
为此:

        while(1)
            for(i = n; i < N/p; i++)
                for(j = m; j < M; j++)
                    fscanf(fp, "%d",&(A[i][j]));
            if(feof(fp))
                break; // hit end-of-file while getting the array
所以,您可以在读取或未读取数组之后,在对其执行任何操作之前,对文件结尾进行测试

不过,最好实际检查fscanf的返回值并处理任何错误条件,如文件结束。

这就是feof的工作原理;它不会告诉您是否即将到达文件末尾,它会告诉您是否已到达文件末尾。也就是说:它不会告诉你什么时候读过最后一个字符;它告诉你什么时候读过最后一个字符。最简单的解决方案是改变这一点:

        while(!feof(fp))
为此:

        while(1)
            for(i = n; i < N/p; i++)
                for(j = m; j < M; j++)
                    fscanf(fp, "%d",&(A[i][j]));
            if(feof(fp))
                break; // hit end-of-file while getting the array
这是:

            for(i = n; i < N/p; i++)
                for(j = m; j < M; j++)
                    fscanf(fp, "%d",&(A[i][j]));
为此:

        while(1)
            for(i = n; i < N/p; i++)
                for(j = m; j < M; j++)
                    fscanf(fp, "%d",&(A[i][j]));
            if(feof(fp))
                break; // hit end-of-file while getting the array
所以,您可以在读取或未读取数组之后,在对其执行任何操作之前,对文件结尾进行测试


不过,实际上检查fscanf的返回值并处理任何错误条件(如文件结尾)会更好。

什么是“大小”“A”、“n”、“n”、“m”的定义?什么是“大小”“A”、“n”、“n”、“m”的定义?+1顺便说一句,OP可能想看看@RichardJ.RossIII它是如何解决问题的?你需要检查fscanf和打印blk之间的EOF。顺便说一句,也许OP想看看@RichardJ.RossIII它是如何解决问题的?您需要检查fscanf和打印blk之间的EOF。