C中文件值的插值函数,返回值错误

C中文件值的插值函数,返回值错误,c,C,我试图用C语言编写一个文件中的插值函数。问题是程序在编译时没有给我错误,但在执行时也没有给我正确的值。 我试过很多方法,但都解决不了。你可以看到我的节目!实际上,我需要这样编程:插值函数是在一个空白处调用的,这个空白是在main中使用的!如果有人能帮忙,请不要犹豫 该方案: /*---------------------------------------------------------------------------- * Standard C library headers

我试图用C语言编写一个文件中的插值函数。问题是程序在编译时没有给我错误,但在执行时也没有给我正确的值。 我试过很多方法,但都解决不了。你可以看到我的节目!实际上,我需要这样编程:插值函数是在一个空白处调用的,这个空白是在main中使用的!如果有人能帮忙,请不要犹豫

该方案:

    /*----------------------------------------------------------------------------
 * Standard C library headers

SOLVED PROBLEM -- THIS C CODE WORKS     *----------------------------------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>




#include "interpolate.h"
#include "conditions.h"




double interpolate(int ipass, char* filename, double time)
{

int i=0 ;
double prevtime=0., nexttime=0. ; 
double prevvalue=0., nextvalue=0. ; 
double readtime=0., readvalue=0. ;
double value=0. ;  
FILE *file=NULL;


file = fopen(filename,"r");


if (file != NULL)
     { 
           rewind(file) ;
           fscanf(file,"%lf %lf", &readtime , &readvalue);
           nexttime = readtime  ;
           nextvalue =  readvalue;

        while(fscanf(file,"%lf %lf", &readtime , &readvalue)==2)
      {


           /* printf("%lf %lf \n", nexttime,nextvalue);
            printf("i am in \n") ;*/
            prevtime  = nexttime  ;
            prevvalue = nextvalue ;
            nexttime  = readtime ;
            nextvalue =  readvalue;

             if(readtime>=time) 
        {   
            printf("prev values: \n") ; 
                        printf("%lf , %lf \n", prevtime, prevvalue) ;
            printf("next values: \n") ; 
                        printf("%lf , %lf \n", nexttime, nextvalue) ;
            break ;
}


           }


     } else
     {
          printf("error! could not open file \n");
          exit(-1)  ;
     }

     value = ((nextvalue-prevvalue)*(time-prevtime)/(nexttime-prevtime)) + prevvalue ;

   fclose(file);
   return value ; 


}

    void conditions()
    {        
        double q=0., var=0. ; 
        char f_q[]="test.data";

        if (f_q != '\0')
        {
            printf("choose value for time \n");
            scanf("%lf", &var) ;
            q = interpolate(1, f_q, var) ;
            printf("interpolate gives Q=%lf \n",  q);
            printf("FILENAME is:%s \n" ,f_q) ; 
        } else
         {
             printf("F_Q = \0");
         }
        return ;
    }

    int main()
    {    
        conditions();
        return 0;
    }
/*----------------------------------------------------------------------------
*标准C库标题
解决了这个问题——这个C代码可以工作*----------------------------------------------------------------------------*/
#包括
#包括
#包括
#包括
#包括“插值.h”
#包括“条件h”
双插值(整数ipass,字符*文件名,双时间)
{
int i=0;
双前一时间=0,下一时间=0;
双精度prevvalue=0,nextvalue=0;
双读取时间=0,读取值=0;
双值=0;
FILE*FILE=NULL;
file=fopen(文件名为“r”);
如果(文件!=NULL)
{ 
倒带(文件);
fscanf(文件“%lf%lf”、&readtime和&readvalue);
nexttime=读取时间;
nextvalue=读取值;
而(fscanf(文件“%lf%lf”、&readtime和&readvalue)==2)
{
/*printf(“%lf%lf\n”,下一个时间,下一个值);
printf(“我在\n”)*/
prevtime=nexttime;
prevvalue=nextvalue;
nexttime=读取时间;
nextvalue=读取值;
如果(读取时间>=时间)
{   
printf(“上一个值:\n”);
printf(“%lf,%lf\n”,prevtime,prevvalue);
printf(“下一个值:\n”);
printf(“%lf,%lf\n”,下一个时间,下一个值);
打破
}
}
}否则
{
printf(“错误!无法打开文件\n”);
出口(-1);
}
值=((nextvalue prevvalue)*(time prevtime)/(nexttime prevtime))+prevvalue;
fclose(文件);
返回值;
}
无效条件()
{        
双q=0,var=0;
char f_q[]=“测试数据”;
如果(f_q!='\0')
{
printf(“为时间选择值”);
scanf(“%lf”和&var);
q=插值(1,f_q,var);
printf(“插值得到Q=%lf\n”,Q);
printf(“文件名为:%s\n”,f_q);
}否则
{
printf(“F_Q=\0”);
}
返回;
}
int main()
{    
条件();
返回0;
}

为什么要使用临时数组作为文件名,而不是将
文件名
参数直接传递给
fopen
?还请注意,传统上所有大写字通常用于预处理器宏。另外,在不返回值的函数中,无需最后使用
return
语句,编译器将自动生成从函数返回的代码。欢迎使用堆栈溢出!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。也。。。请将您的代码格式设置得更好…您是否已选中
var
?您的
scanf
格式缺少说明符。您可能是指
scanf(“%lf”和&var)
。当读取时间超过插值时间时,您可能也不想退出(0)(整个程序);只需
break
loop@tafa:您无法捕获文件中时间范围之外的案例,但除了这些之外,您的代码现在似乎可以正常工作。如果仍然存在问题,请给出一个EXEPCED结果的示例输入?在检查fopen()是否成功之前尝试“倒带()”文件是产生seg故障事件的好方法,这将非常难以调试