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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:33:23