如何将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
相关产品推荐
相关产品推荐

