C语言实现文件逐行读取 两行值数量匹配时对应位置求和
代码问题排查
你写的read函数存在4个核心错误:
- 返回值类型设计错误:需要返回当前行读取到的有效数值个数(整数),才能后续判断相邻两行长度是否匹配,返回float类型的首元素没有实际作用
- 首数字读取逻辑错误:你把行首的个数标识读到了
number数组的首地址,类型不匹配会直接造成内存污染 - 循环终止条件完全无效:
i != '\n'是拿循环变量和换行符的ASCII码(10)做比较,根本不会在换行位置停止;而且fscanf读取%d/%f时会自动跳过所有空白符(空格、换行、制表符),不需要手动判断换行位置——因为每行第一个数字已经明确给出了该行后续的数值总数,直接按这个数读取即可 - 没有做数组长度边界限制,容易触发缓冲区溢出
可直接运行的实现代码
#include <stdio.h> #define MAX_NUM_PER_LINE 128 // 单行最大支持128个数值,可按需调整 // 读取成功返回当前行有效数值个数,返回-1表示文件读取结束/格式错误 int read(FILE *fp, float array[]) { int count; int ret = fscanf(fp, "%d", &count); if (ret != 1) return -1; for (int i = 0; i < count; i++) { if (fscanf(fp, "%f", &array[i]) != 1) return -1; } return count; } // 长度匹配返回求和结果的元素个数,长度不匹配返回-1 int add(float a1[], int len1, float a2[], int len2, float sum[]) { if (len1 != len2) return -1; for (int i = 0; i < len1; i++) { sum[i] = a1[i] + a2[i]; } return len1; } // 输出结果,is_error为1时打印错误提示 void output(float sum[], int len, int is_error) { if (is_error) { printf("Error(Number n1 != Number n2)\n"); return; } for (int i = 0; i < len; i++) { if (i > 0) printf(" "); printf("%g", sum[i]); // %g自动省略浮点数末尾多余的0,匹配题目输出格式 } printf("\n"); } int main() { FILE *fp = fopen("data.txt", "r"); // 替换为你的txt文件路径 if (!fp) { perror("文件打开失败"); return 1; } float arr1[MAX_NUM_PER_LINE], arr2[MAX_NUM_PER_LINE], sum[MAX_NUM_PER_LINE]; int len1, len2, sum_len; while (1) { len1 = read(fp, arr1); if (len1 == -1) break; len2 = read(fp, arr2); if (len2 == -1) break; // 若文件存在奇数行,可在此处补充异常处理逻辑 sum_len = add(arr1, len1, arr2, len2, sum); if (sum_len == -1) { output(NULL, 0, 1); } else { output(sum, sum_len, 0); } } fclose(fp); return 0; }
关键逻辑说明
- 不需要逐字符判断换行:输入格式已经通过行首数字明确给出了每行的数值数量,
fscanf会自动跳过所有空白分隔符,逐字符判断换行反而会把逻辑复杂化 - 用
%g格式符打印浮点数,可以自动去掉末尾无意义的0,比如不会把6.6打印成6.600000,完全匹配题目要求的输出格式 - C语言中数组作为函数参数传递时会退化为指针,无法直接获取数组长度,因此通过
read函数的返回值传递每行元素个数,是最简洁的实现方式,完全符合题目要求的三个核心函数的功能划分
内容的提问来源于stack exchange,提问作者Hilfe
相关产品推荐
相关产品推荐

