C语言传递文件路径至函数读取文件出错及后续读取异常求助
问题分析与解决
遇到的问题
- 初始代码无法打开代码目录下的
input.txt,提示Failed to open input file. 1 - 修改代码后,使用
fscanf(pFile,"%f",&num)时程序进入死循环 - 使用
fread(daBuf,sizeof(float), 1, pFile)时,daBuf[]读取不到有效内容,输出全为0.000
初始代码
#include "stdio.h" void func(const char *srcFilePath) { FILE *pFile = fopen(srcFilePath, "r"); float num; if (pFile == NULL) { printf("** Failed to open input file. 1\n"); } else { fscanf(pFile,"%f",num); fclose(pFile); } printf("num = %f",num); } void main() { const char inputfile[]="input.txt"; func(inputfile); }
更新后的代码
#include <stdio.h> void func(const char *srcFilePath) { FILE *pFile = fopen(srcFilePath, "r"); float num; float daBuf[24]; if (pFile == NULL) { //printf("** Failed to open input file. 1\n"); perror(srcFilePath) ; } else{ while(!feof(pFile)){ //fscanf(pFile,"%f",&num); //printf("num = %f \n",num); fread(daBuf,sizeof(float), 1, pFile); } } for(int i=0;i<5;i++) { printf(" daBuf = %f \n",daBuf[i]); } } void main(){ const char inputfile[]="/home/debian/progdir/input"; func(inputfile); }
输入文件示例
1.589211,
1.557358,
1.525398,
1.493311,
1.483532,
1.483766,
1.654107,
1.621582,
问题解决
1. 文件无法打开的问题
- 更新后的代码中文件路径写成
/home/debian/progdir/input,但原文件是input.txt,缺少.txt后缀,这是fopen失败的核心原因; - 初始代码中
fscanf(pFile,"%f",num)存在内存错误,必须传递变量地址&num; - 若使用相对路径
input.txt,需确保程序运行的工作目录与代码目录一致,否则建议使用绝对路径。
2. fscanf死循环问题
while(!feof(pFile))逻辑错误:feof仅在尝试读取失败后才会返回真,导致循环多执行一次;正确做法是将fscanf的返回值作为循环条件,判断是否成功读取数据;- 输入文件中每个浮点数后带有逗号,
%f格式符无法跳过逗号,第一次读取后指针停留在逗号处,后续fscanf持续失败但feof未触发,形成死循环;需将格式串改为"%f,"以匹配输入格式。
3. fread读取无效的问题
fread用于读取二进制数据,但输入文件是文本格式的浮点数,直接用fread会把文本字符解析为二进制float,结果必然无效;必须使用文本读取函数(fscanf/fgets+sscanf)处理文本输入;- 原代码中每次
fread都覆盖daBuf[0],未移动存储位置,最终数组仅保留最后一次无效读取值,其余元素为未初始化的随机值。
修正后的完整代码
#include <stdio.h> #define BUF_SIZE 24 void func(const char *srcFilePath) { FILE *pFile = fopen(srcFilePath, "r"); float daBuf[BUF_SIZE]; int count = 0; if (pFile == NULL) { perror(srcFilePath); return; } // 用fscanf返回值控制循环,匹配带逗号的输入格式 while (count < BUF_SIZE && fscanf(pFile, "%f,", &daBuf[count]) == 1) { count++; } fclose(pFile); // 仅输出有效读取的内容 for (int i = 0; i < count; i++) { printf("daBuf[%d] = %f\n", i, daBuf[i]); } } int main() { // 确保路径正确,此处使用绝对路径 const char inputfile[] = "/home/debian/progdir/input.txt"; func(inputfile); return 0; }
关键修正点
- 补全文件路径的
.txt后缀; - 用
fscanf返回值作为循环条件,避免死循环; - 格式串改为
"%f,",匹配输入文件的逗号分隔符; - 用
count记录有效数据个数,避免输出未初始化的数组元素; - 替换错误的
fread用法,改用文本读取方式处理文本文件; - 修正初始代码中
fscanf未传地址的错误; - 将
main函数改为标准的int main()并返回0。
内容的提问来源于stack exchange,提问作者stella
相关产品推荐
相关产品推荐

