You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:27:09