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

如何逐行读取含任意长度行的文件?现有代码求助

解决逐行读取任意长度行的问题

你的代码核心问题在于:每次调用readLine都会重新打开文件并通过fseek定位到开头,所以永远只能读取第一行。要实现逐行推进,必须让文件指针在多次读取间保持当前位置,不要每次重新打开文件。

修改方案

核心调整思路

  • 不在readLine内打开文件,而是将已打开的FILE*作为参数传入,这样读取位置会在多次调用间持续保留。
  • 优化动态扩容逻辑:原代码每次扩容后从头重读,效率极低,改为逐字符读取并追加内容,直到遇到换行或文件结尾。

修改后的完整代码

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

char* readLine(FILE* file)
{
    if (file == NULL || feof(file))
        return NULL;

    size_t size = 32; // 初始缓冲区大小,可根据需求调整
    char* line = malloc(size * sizeof(char));
    if (line == NULL)
        return NULL;

    size_t pos = 0;
    int c;

    // 逐字符读取,直到换行或文件结束
    while ((c = fgetc(file)) != EOF && c != '\n')
    {
        // 缓冲区满时翻倍扩容
        if (pos + 1 >= size)
        {
            size *= 2;
            char* temp = realloc(line, size * sizeof(char));
            if (temp == NULL)
            {
                free(line);
                return NULL;
            }
            line = temp;
        }
        line[pos++] = (char)c;
    }

    // 保留换行符(如果不是文件结尾)
    if (c == '\n')
    {
        if (pos + 1 >= size)
        {
            size += 1;
            char* temp = realloc(line, size * sizeof(char));
            if (temp == NULL)
            {
                free(line);
                return NULL;
            }
            line = temp;
        }
        line[pos++] = '\n';
    }

    // 添加字符串结束符
    if (pos + 1 >= size)
    {
        size += 1;
        char* temp = realloc(line, size * sizeof(char));
        if (temp == NULL)
        {
            free(line);
            return NULL;
        }
        line = temp;
    }
    line[pos] = '\0';

    return line;
}

int main()
{
    FILE* file = fopen("config_01.dot", "r");
    if (file == NULL)
    {
        perror("无法打开文件");
        return EXIT_FAILURE;
    }

    char* line;
    int lineNum = 1;
    while ((line = readLine(file)) != NULL)
    {
        printf("第%d行 = %s", lineNum++, line);
        free(line); // 必须释放内存,避免泄漏
    }

    fclose(file);
    return EXIT_SUCCESS;
}

代码说明

  • 文件指针复用:readLine接收已打开的文件指针,每次调用从上次读取的断点继续,自然实现逐行推进。
  • 高效扩容:采用缓冲区翻倍扩容的方式,比固定增量更高效;逐字符读取避免了从头重读的冗余操作。
  • 内存安全:扩容失败时及时释放已分配内存,读取完成后主动释放每行的缓冲区,杜绝内存泄漏。
  • 边界处理:兼容空行、文件结尾无换行符等场景,确保每行都以\0结尾,符合C字符串规范。

用你提供的测试文本运行代码,会逐行输出所有内容,长短行都能正确读取,不会重复读取第一行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:00:33