C语言文本处理程序仅读取单行而非全部输入内容问题排查
代码错误分析
- 缺少外层逐行读取循环:当前代码仅执行1次读取操作,只能处理第一行内容,没有循环读取文件剩余所有行的逻辑,是仅输出第一行的核心原因。
- 读取整行的函数使用错误:
fscanf(fr, "%s", riadok)以%s读取时碰到空格、换行符就会终止,无法读取包含空格的完整行,读取整行应使用fgets()函数。 - 变量未初始化:变量
y声明后未赋值就参与判断y < 1000,初始值是内存随机值,会导致行内容处理逻辑完全不可控。 - 行处理逻辑边界错误:行内容处理的循环条件不应该是
y < 1000,应该判断到字符串结束符'\0'就终止,否则会处理数组中未赋值的垃圾内容,甚至触发越界访问。 - 输出缺少换行保留逻辑:处理完的行写入输出文件时没有保留换行符,会导致所有输出内容挤在同一行。
- 缺少文件打开成功校验:如果输入/输出文件打开失败,后续读写操作会直接触发程序崩溃。
修复后参考代码
#include <stdio.h> int cv6_treti() { char riadok[1000]; // 行号从1开始计数 int line_num = 1; FILE *fr = fopen("input.txt", "r"); FILE *fw = fopen("output.txt", "w"); // 文件打开失败校验 if (fr == NULL || fw == NULL) { perror("文件打开失败"); return -1; } // 外层循环逐行读取,读到文件末尾fgets返回NULL自动终止 while (fgets(riadok, sizeof(riadok), fr) != NULL) { int y = 0; // 遍历当前行每个字符,到结束符停止 while (riadok[y] != '\0') { if (line_num % 2 == 1) { // 奇数行替换数字为* if (riadok[y] >= '0' && riadok[y] <= '9') { riadok[y] = '*'; } } else { // 偶数行替换字母为- if ((riadok[y] >= 'a' && riadok[y] <= 'z') || (riadok[y] >= 'A' && riadok[y] <= 'Z')) { riadok[y] = '-'; } } y++; } // 写入处理后的行,fgets会自带换行符无需额外添加 fprintf(fw, "%s", riadok); // 行号递增 line_num++; } fclose(fw); fclose(fr); return 0; }
内容的提问来源于stack exchange,提问作者Doctor Gonzo
相关产品推荐
相关产品推荐

