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

C语言读取文件指定行存入数组失败,求代码错误排查

你的代码存在这些问题,逐一修正即可:
  • fgets循环条件错误:fgets读取失败或到文件末尾时返回的是NULL(空指针),不是'\0'(字符串结束符),所以循环条件应该写成:

    while(fgets(line, 200, file) != NULL)
    
  • 目标行判断逻辑错误:line[0] == 1是在判断行首字符的ASCII值为1(对应控制字符SOH),这几乎不是你想要的逻辑。如果是要找行首为字符'1'的行,应该写成line[0] == '1';如果是要找第一行,需要额外加计数器变量跟踪行号,比如:

    int line_num = 0;
    while(fgets(line, 200, file) != NULL) {
        line_num++;
        if(line_num == 1) {
            // 处理第一行
        }
    }
    
  • 找到目标行后错误调用fgets:当你找到符合条件的行时,line里已经存了当前行的内容,但你又调用了一次fgets,这会读取下一行覆盖line,导致打印的是下一行而非目标行。直接打印line即可:

    if(/* 正确的判断条件 */) {
        printf("%s", line);
    }
    
  • 未实现目标行存入数组的需求:你的代码仅打印行,没有将目标行存储到数组里。可以定义二维数组保存找到的行,比如:

    char target_lines[10][200]; // 最多存10行,每行200字符
    int count = 0;
    // 循环内找到目标行时:
    if(/* 判断条件 */) {
        strcpy(target_lines[count], line);
        count++;
        // 加判断防止数组越界
        if(count >= 10) break;
    }
    
修正后的完整示例代码

假设你要找行首为'1'的行并存入数组:

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

int main()
{
    FILE *file = fopen("line.txt", "r");
    if(file == NULL)
    {
        printf("FILE OPEN ERROR");
        return 1;
    }
    
    char line[200];
    char target_lines[10][200]; // 存储目标行的数组
    int count = 0;

    while(fgets(line, 200, file) != NULL)
    {
        // 判断行首是否为字符'1'
        if(line[0] == '1')
        {
            strcpy(target_lines[count], line);
            printf("已存储目标行:%s", target_lines[count]);
            count++;
            if(count >= 10) { // 防止数组越界
                printf("数组已满,停止存储");
                break;
            }
        }
    }

    fclose(file);
    
    // 后续可使用target_lines数组里的内容
    printf("\n已存储%d条目标行\n", count);
    for(int i=0; i<count; i++){
        printf("第%d条:%s", i+1, target_lines[i]);
    }
    
    return 0;
}

内容的提问来源于stack exchange,提问作者RichpooR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:03:11