C语言读取文件指定行范围:while(feof)循环无法终止求助
问题分析与修复方案
1. void函数能否返回1?
不能。void类型函数的定义是不返回任何值,C标准明确规定:void函数中只能使用不带表达式的return;语句(或省略return,函数执行到末尾自动返回)。如果写return 1;,编译器会直接报错——因为void函数没有返回值类型,无法返回整数。
修复建议:
- 若仅需要终止函数执行,将
return 1;改为return; - 若需要向调用者传递错误状态,可将函数返回类型改为
int(比如返回0表示成功,非0表示失败),或通过指针参数传递错误信息
2. while循环无法终止的原因与修复
你的循环条件while(feof(Data)==0)是典型的feof误用:feof()只有在已经尝试读取并到达文件末尾后才会返回非0值。也就是说,当fgets读取到最后一行时,feof仍为0,循环会继续执行下一次。此时fgets读取失败(返回NULL),但i仍然自增,甚至可能因数组越界引发未定义行为,表现为循环无法终止。
正确的做法是直接判断fgets的返回值:
while (i < 50 && fgets(strArray[i], sizeof(strArray[i]), Data) != NULL) { i++; }
- 新增
i < 50是为了避免数组越界(strArray仅能存储50行) sizeof(strArray[i])确保读取的字符数不超过每行的缓冲区大小,防止溢出
3. 其他代码问题修复
3.1 fopen赋值的优先级错误
原代码if(Data = fopen(cFileName, "rt") == NULL)中,==优先级高于=,实际执行逻辑是:
Data = (fopen(cFileName, "rt") == NULL);
这会把布尔值(0或1)赋值给Data,而非文件指针。正确写法需给赋值表达式加括号:
if( (Data = fopen(cFileName, "rt")) == NULL ){ printf("File could not be opened\n"); return; }
3.2 数组缓冲区溢出问题
原代码fgets(strArray[i], 200, Data)中,strArray每行仅50字节,读取200字节会导致缓冲区溢出,引发未定义行为。需改为:
fgets(strArray[i], sizeof(strArray[i]), Data)
3.3 for循环的合理性优化
原代码for(n; n<=m; n++)直接修改函数参数n,不符合良好编程习惯,且未判断行号是否超出实际读取范围。建议改为:
for(int idx = n; idx <= m; idx++){ if(idx >= 0 && idx < i) { printf("%s", strArray[idx]); } else { printf("Line %d does not exist\n", idx); } }
3.4 遗漏文件关闭操作
打开文件后未调用fclose(Data),会导致资源泄漏,需在函数末尾添加该语句。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> void readValues(char cFileName[75], int n, int m) { char strArray[50][50]; int i = 0; FILE *Data; if( (Data = fopen(cFileName, "rt")) == NULL ){ printf("File could not be opened\n"); return; } while (i < 50 && fgets(strArray[i], sizeof(strArray[i]), Data) != NULL) { i++; } for(int idx = n; idx <= m; idx++){ if(idx >= 0 && idx < i) { printf("%s", strArray[idx]); } else { printf("Line %d does not exist\n", idx); } } fclose(Data); } int main() { char cTargetName[75] = {"C:/Users/User1/Desktop/C_Projects_1/TestData.txt"}; int iLower = 2; int iHiger = 4; readValues(cTargetName, iLower, iHiger); return 0; }
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

