Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从数据文件中读取纯C_C_Gcc_File Io_Scanf - Fatal编程技术网

从数据文件中读取纯C

从数据文件中读取纯C,c,gcc,file-io,scanf,C,Gcc,File Io,Scanf,我在Ubuntu 12.04.4 LTS 32位上使用编译器gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3,使用fscanf函数读取文件有点问题。格式说明符%f无法读入代码中声明为双精度的变量,但%lf有效。这种谨慎背后的原因是什么?我将在下面提供一个代码片段和一个数据文件: 编辑:我在使用以下代码段的较大代码中遇到分段错误。我试着删除前两行,去掉char和两个fgets调用,但都不起作用 #include <stdio.h> #include <

我在Ubuntu 12.04.4 LTS 32位上使用编译器gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3,使用fscanf函数读取文件有点问题。格式说明符%f无法读入代码中声明为双精度的变量,但%lf有效。这种谨慎背后的原因是什么?我将在下面提供一个代码片段和一个数据文件:

编辑:我在使用以下代码段的较大代码中遇到分段错误。我试着删除前两行,去掉char和两个fgets调用,但都不起作用

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>
#include <fftw3.h>
#define N 3500
int main(void)
{
    FILE * data = fopen("data_1657.dta", "r"), * fft = fopen("fftq3.dat", "w+");
    if(!data) // Checking if the file opened succesfully
        return 1;
    fftw_complex *in, *out;
    fftw_plan forward;
    forward = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    double *t, *ft, *err;
    int i = 0;
    t = (double *) malloc(sizeof(double) * N);
    ft = (double *) malloc(sizeof(double) * N);
    err = (double *) malloc(sizeof(double) * N);
    char str [100];
    fgets(str, 100, data);
    fgets(str, 100, data);
    while (fscanf(data, "%lf    %lf     %lf", &t[i], &ft[i], &err[i]) == 3)
    {
        printf("%lf \t %lf \n", t[i], ft[i]);
        i++;
    }


    fftw_execute(forward);
    fclose(data);
    fclose(fft);
    fftw_destroy_plan(forward);
    fftw_free(in);
    fftw_free(out);
    free(t);
    free(ft);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义3500
内部主(空)
{
文件*data=fopen(“data_1657.dta”,“r”),*fft=fopen(“fftq3.dat”,“w+”);
if(!data)//检查文件是否成功打开
返回1;
fftw_复合体*in,*out;
fftw_计划前进;
正向=fftw\u平面图\u dft\u 1d(N,输入,输出,fftw\u正向,fftw\u估算);
双*t,*ft,*err;
int i=0;
t=(双*)malloc(sizeof(双)*N);
ft=(双*)malloc(sizeof(双)*N);
err=(双*)malloc(sizeof(双)*N);
char-str[100];
fgets(str,100,数据);
fgets(str,100,数据);
而(fscanf(数据,“%lf%lf%lf”、&t[i]、&ft[i]、&err[i])==3)
{
printf(“%lf\t%lf\n”,t[i],ft[i]);
i++;
}
fftw_执行(转发);
fclose(数据);
fclose(fft);
fftw销毁计划(前进);
fftw_自由(英寸);
fftw_免费(外出);
自由(t);
免费(英尺);
返回0;
}
编辑:已更正的循环

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

int main(void)
{
    FILE * data = fopen("data_1657.dta", "r");
    double t, count, err;
while (fscanf(data, "%lf %lf %lf", &t, &count, &err) == 3)
{
    printf("%f \t %f \t %f \n", t, count, err);
}   


    return 0;
}




  time in seconds       count rate(c/s)  error
   ---------------------    --------      -------
    281.3251281976699829     115.639      21.228
    281.8250962048768997     149.639      22.774
    282.3250641971826553     111.639      21.039
    282.8250322043895721     155.639      23.036
    283.3250001966953278     141.639      22.420
    283.8249682039022446     107.639      20.848
    284.3249361962080002     135.639      22.151
    284.8249042034149170     151.639      22.861
    285.3248721957206726     127.639      21.786
    285.8248402029275894     143.639      22.509
    286.3248081952333450     129.639      21.878
    286.8247760981321335     123.639      21.602
    287.3247441053390503      93.639      20.166
    287.8247120976448059      95.639      20.264
    288.3246801048517227     131.639      21.969
    288.8246480971574783     127.639      21.786
    289.3246161043643951     107.639      20.848
    289.8245840966701508      91.639      20.066
    290.3245521038770676      77.639      19.356
    290.8245200961828232     115.639      21.228
    291.3244881033897400     109.639      20.944
    291.8244560956954956     125.639      21.694
    292.3244241029024124     107.639      20.848
    292.8243920952081680     105.639      20.752
    293.3243599981069565     133.639      22.060
    293.8243280053138733     183.639      24.221
    294.3242959976196289     161.639      23.295
    294.8242640048265457     141.639      22.420
#包括
#包括
#包括
内部主(空)
{
文件*data=fopen(“data_1657.dta”,“r”);
双t,计数,错误;
而(fscanf(数据,“%lf%lf%lf”,&t,&count,&err)==3)
{
printf(“%f\t%f\t%f\n”,t,count,err);
}   
返回0;
}
以秒为单位的时间计数率(c/s)错误
---------------------    --------      -------
281.3251281976699829     115.639      21.228
281.8250962048768997     149.639      22.774
282.3250641971826553     111.639      21.039
282.8250322043895721     155.639      23.036
283.3250001966953278     141.639      22.420
283.8249682039022446     107.639      20.848
284.3249361962080002     135.639      22.151
284.8249042034149170     151.639      22.861
285.3248721957206726     127.639      21.786
285.8248402029275894     143.639      22.509
286.3248081952333450     129.639      21.878
286.8247760981321335     123.639      21.602
287.3247441053390503      93.639      20.166
287.8247120976448059      95.639      20.264
288.3246801048517227     131.639      21.969
288.8246480971574783     127.639      21.786
289.3246161043643951     107.639      20.848
289.8245840966701508      91.639      20.066
290.3245521038770676      77.639      19.356
290.8245200961828232     115.639      21.228
291.3244881033897400     109.639      20.944
291.8244560956954956     125.639      21.694
292.3244241029024124     107.639      20.848
292.8243920952081680     105.639      20.752
293.3243599981069565     133.639      22.060
293.8243280053138733     183.639      24.221
294.3242959976196289     161.639      23.295
294.8242640048265457     141.639      22.420
顺便问一下,在不删除数据文件中的两个标题行的情况下,是否可以从数据文件中的第三行开始读取

提前感谢当
(f)scanf()
看到
%lf
时,它需要指向双精度
的指针(通常为64位),而
%f
只需要指向浮点
的指针(通常为32位)

(f)scanf()
看到
%lf
时,它需要指向双精度
的指针(通常为64位),而
%f
只需要指向浮点
的指针(通常为32位)


如果要读取双变量,则需要
%lf
。scanf不是类型安全的;您必须通过将格式说明符与变量类型仔细匹配来帮助函数。对于
%ld
等,情况也一样。

如果要读取双变量,则需要
%lf
。scanf不是类型安全的;您必须通过将格式说明符与变量类型仔细匹配来帮助函数。对于
%ld
等,情况也一样。

您可以使用fgets()读取一行文本。对前两行执行两次,使用一个缓冲区,然后丢弃。或者,您可以只阅读字符,直到您点击
'\n'
两次。我一点也不知道为什么
%lf
对您有效,而
%f
对您无效,但如果您使用(这不是标准,但应该存在于此系统中)一次阅读整行,从长远来看,您会更快乐,然后使用解析该行并将字符串转换为浮点量<代码>strod
加上列上的内部循环就是解析此输入格式所需的全部内容。您可以跳过外部
getline
循环的前两行。@Zack我可以试试,谢谢您的建议。您的代码只保存(打印)奇数行(第1行、第3行、第5行…)。您的
do{fscanf(…);printf(…);}while(fscanf(…)!=3)循环是错误的,因为它为每一个打印的数字读取两组数字,并且没有检查第一个
fscanf()
的状态。一般来说,你应该警惕
do…而
循环;I/O也是如此。您需要
while(fscanf(…)==3){printf(…);}
-在顶部测试的循环,并显式检查每个输入操作。您可以使用fgets()读取一行文本。对前两行执行两次,使用一个缓冲区,然后丢弃。或者,您可以只阅读字符,直到您点击了两次
'\n'
为止。我一点也不知道为什么
%lf
对您有效,而
%f
对您无效,但您会很开心
scanf: %f — float; %lf — double; %Lf — long double