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

C语言读取文本文件每行内容并合并为一行写入新文件的问题排查

问题分析与修复方案

原代码的核心问题

  • 未处理换行符:原代码只是逐字符复制输入文件的所有内容,包括换行符\n,所以输出文件会和输入文件格式完全一致,无法实现“合并为一行”的需求。
  • 未实现按行存储变量的逻辑:代码没有按行读取内容并将每行存入独立变量,完全跳过了需求中这一关键步骤。
  • 资源泄漏风险:打开输出文件fout后没有调用fclose(fout),可能导致缓冲区数据无法完全写入文件,造成内容丢失。

修复后的代码

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

#define MAX_LINE_LEN 100  // 根据实际需求调整每行最大长度

int main(int argc, char *argv[])
{
    char const *const fileName = "cppbuzz1.txt";
    char line1[MAX_LINE_LEN], line2[MAX_LINE_LEN], line3[MAX_LINE_LEN];
    FILE *file = fopen(fileName, "r");
    FILE *fout;

    if (!file)
    {
        printf("\n无法打开文件: %s ", fileName);
        return -1;
    }

    // 按行读取内容到不同变量
    fgets(line1, MAX_LINE_LEN, file);
    fgets(line2, MAX_LINE_LEN, file);
    fgets(line3, MAX_LINE_LEN, file);

    // 去除每行末尾的换行符
    line1[strcspn(line1, "\n")] = '\0';
    line2[strcspn(line2, "\n")] = '\0';
    line3[strcspn(line3, "\n")] = '\0';

    fout = fopen("output.txt", "w");
    if (!fout)
    {
        printf("\n无法创建输出文件");
        fclose(file);
        return -1;
    }

    // 将所有变量内容合并为一行写入
    fprintf(fout, "%s %s %s", line1, line2, line3);

    // 关闭所有打开的文件
    fclose(file);
    fclose(fout);
    return 0;
}

关键修改说明

  1. 按行读取并存储变量:使用fgets()按行读取输入内容,分别存入line1、line2、line3三个变量,对应输入文件的三行内容。
  2. 去除换行符:用strcspn()定位每行末尾的\n并替换为字符串结束符\0,避免写入时带换行。
  3. 合并写入:通过fprintf()将三个变量的内容用空格拼接后写入输出文件,实现一行输出。
  4. 完善资源管理:添加fclose(fout)确保输出文件缓冲区数据完全写入,同时增加输出文件打开失败的错误处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:03:00