如何用while循环结合fscanf读取文件至末尾并修复段错误
修复读取双数据行文件的while循环段错误问题
核心问题分析
你的段错误大概率来自两个常见坑:要么是fscanf传参错误(没传变量地址),要么是用feof作为循环条件导致多执行一次无效读取,触发非法内存访问。下面直接给修复方案和关键说明。
错误代码的典型问题(对应你的场景)
#include <stdio.h> int main() { FILE *in_fp = fopen("input.txt", "r"); FILE *out_fp = fopen("output.txt", "w"); int id; float amount; // 坑1:用feof判断循环,会多读一次 while (!feof(in_fp)) { // 坑2:fscanf没传指针,直接传变量值,写入非法内存 fscanf(in_fp, "%d %f", id, amount); float result = amount * 0.8; // 消费计算示例 fprintf(out_fp, "客户%d最终消费:%.2f\n", id, result); } fclose(in_fp); fclose(out_fp); return 0; }
修复后的可运行代码
#include <stdio.h> int main() { FILE *in_fp = fopen("input.txt", "r"); FILE *out_fp = fopen("output.txt", "w"); // 先检查文件是否打开成功,避免空指针操作 if (in_fp == NULL || out_fp == NULL) { perror("文件打开失败"); return 1; } int id; float amount; // 正确循环条件:判断fscanf是否成功读取2个数据 while (fscanf(in_fp, "%d %f", &id, &amount) == 2) { // 这里替换成你的消费计算逻辑 float result = amount * 0.8; fprintf(out_fp, "客户%d最终消费:%.2f\n", id, result); } fclose(in_fp); fclose(out_fp); return 0; }
关键修复点说明
- 必须检查文件指针:如果输入/输出文件不存在或权限不足,
fopen会返回NULL,后续操作空指针直接触发段错误,所以一定要加判断。 - 修正fscanf传参:
fscanf需要写入变量的内存地址,所以必须加&符号,之前直接传变量值会让函数往非法内存地址写数据,立刻炸段错误。 - 抛弃feof循环条件:
feof只有在读取失败后才会置位,用它当循环条件会导致最后一次循环读取失败后还继续执行计算和写入,访问无效数据。正确做法是用fscanf的返回值判断——返回2表示成功读取了整数+浮点数两个数据,返回其他值(EOF或格式不匹配)就终止循环。
内容的提问来源于stack exchange,提问作者PapaPumpkin
相关产品推荐
相关产品推荐

