如何利用I/O重定向结合scanf读取含空格文本文件中的浮点值?
代码合理性检查:使用scanf与I/O重定向读取文本文件
你的代码存在几个关键问题,无法正确完成读取任务,具体分析及修正建议如下:
原代码问题分析
#include <stdio.h> #include <math.h> int main(void){ int readingsLen = 5040; float readings[readingsLen]; float* readingsPtr = (float*)readings; while (scanf("%.2f", readingsPtr) != EOF){ readingsPtr++; } }
- 格式字符串错误:
scanf的格式字符串不能用"%.2f",这是printf专属的输出精度控制语法。读取浮点数只需用"%f",scanf会自动识别文本中的浮点数值,精度控制对读取逻辑无意义。 - 数组越界风险:循环未限制读取次数,若文本文件中的浮点数数量超过5040个,指针会越界访问数组外内存,触发未定义行为。
- 冗余代码:
<math.h>头文件未被使用,可直接移除;(float*)强制转换多余,数组名readings可直接隐式转换为float*类型。
修正后的代码
#include <stdio.h> int main(void){ const int readingsLen = 5040; float readings[readingsLen]; float* readingsPtr = readings; int count = 0; // 限制读取数量,避免数组越界 while (count < readingsLen && scanf("%f", readingsPtr) != EOF){ readingsPtr++; count++; } // 可选:打印读取结果用于验证 printf("共读取%d个数值\n", count); readingsPtr = readings; for(int i = 0; i < count; i++){ printf("%.2f ", *(readingsPtr + i)); } printf("\n"); return 0; }
I/O重定向使用说明
编译代码后,在命令行通过以下方式实现重定向读取:
# 假设编译后程序名为read_data,文本文件为input.txt ./read_data < input.txt
内容的提问来源于stack exchange,提问作者joggle
相关产品推荐
相关产品推荐

