You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将C语言中基于feof的while循环改写为for循环?

C语言中改写基于feof的while循环为for循环

原代码中的while(!feof(inputFile))存在逻辑缺陷:feof仅在读取操作失败且因文件结束时才会被置位,这会导致最后一次fscanf读取失败后,i仍然自增,可能超出数组A的分配边界(A仅能容纳n*m个元素)。

正确的改写方式是基于需要读取的元素总数控制循环,同时验证fscanf的返回值,确保每次读取成功。替换原while循环的代码如下:

// 改写为for循环,严格控制读取次数并验证结果
for (int i = 0; i < n * m; ++i) {
    // 检查是否成功读取一个整数
    if (fscanf(inputFile, "%d", &A[i]) != 1) {
        printf("读取数据失败或文件内容不足\n");
        free(A);
        fclose(inputFile);
        exit(1);
    }
}

补充说明:

  • 循环次数直接设为n*m,正好匹配数组A的容量,避免越界;
  • 通过fscanf的返回值判断读取是否成功(成功读取一个整数时返回1),比依赖feof更可靠;
  • 原代码未关闭文件,建议在程序结束前添加fclose(inputFile);,同时在内存分配失败、读取失败时及时释放已分配的内存,避免内存泄漏。

完整的修正后代码示例:

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

int main(){
    int n, m;
    int *A;
    FILE* inputFile = fopen("Input.dat", "r");
    
    if(inputFile == NULL){
        printf("读取文件时发生错误\n");
        exit(0);
    }

    // 读取行列数并验证
    if (fscanf(inputFile,"%d", &n) != 1 || fscanf(inputFile,"%d", &m) != 1) {
        printf("读取行列数失败\n");
        fclose(inputFile);
        exit(0);
    }

    A = malloc((n*m) * sizeof(int)); // C语言中无需强制转换malloc的返回值
    if(A == NULL) {
        printf("内存分配失败\n");
        fclose(inputFile);
        exit(0);
    }

    // 改写后的for循环
    for (int i = 0; i < n * m; ++i) {
        if (fscanf(inputFile, "%d", &A[i]) != 1) {
            printf("读取数据失败或文件内容不足\n");
            free(A);
            fclose(inputFile);
            exit(1);
        }
    }   

    for(int i=0; i<n; i++){
        printf("\n");
        for(int j=0; j<m; j++){
            printf("%d ", A[i * m + j]); // 加空格分隔,方便查看输出
        }
    }

    // 释放资源
    free(A);
    fclose(inputFile);

    return 0;
}

内容的提问来源于stack exchange,提问作者Mohammed Ghazwan Almilhim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:15:45