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; }
关键修改说明
- 按行读取并存储变量:使用
fgets()按行读取输入内容,分别存入line1、line2、line3三个变量,对应输入文件的三行内容。 - 去除换行符:用
strcspn()定位每行末尾的\n并替换为字符串结束符\0,避免写入时带换行。 - 合并写入:通过
fprintf()将三个变量的内容用空格拼接后写入输出文件,实现一行输出。 - 完善资源管理:添加
fclose(fout)确保输出文件缓冲区数据完全写入,同时增加输出文件打开失败的错误处理。
内容的提问来源于stack exchange,提问作者cereyanci23
相关产品推荐
相关产品推荐

