c - 使用 fscanf() 在 C 中以科学格式读取数字时出现问题

标签 c linux ubuntu scanf

我有多个文本文件,数据如下:

    0.000000E+0 0.000000E+0
    1.800000E-1 0.000000E+0
    4.200000E-1 0.000000E+0
    6.950000E-1 0.000000E+0
    9.450000E-1 0.000000E+0
    1.225000E+0 0.000000E+0

由测试仪器生成。两列数据由制表符分隔。我正在尝试将此数据文件读入程序以进行进一步处理。我写的代码如下:

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

float **make_array(int size); //function to make 2D array

int main(int argc, char **argv)
{
        FILE *infile;
        infile=fopen(argv[1], "r");

//count number of lines in file
        char c;
        int i=0, numlines=0;
        while((c=fgetc(infile))!=EOF)
                if(c == '\n') numlines++;

        printf("numlines: %d\n", numlines);

        float **entry = make_array(numlines);

//read inputfile
        for(i=0; i< numlines; i++)
                fscanf(infile, " %G\t%G", &entry[0][i], &entry[1][i]);
//verify read values
        printf("\n");
        for(i=0; i<numlines; i++)
                printf("%E\t%E\n", entry[0][i], entry[1][i]);

//clean up before exiting
        free(entry[0]);
        free(entry[1]);
        free(entry);
        fclose(infile);
return 0;
}


//create a 2D array of 2 by {size}
float **make_array(int size){
        int i;
        float **entry = malloc(2*sizeof(float *));
        if(entry==NULL) exit(1);
        entry[0] = malloc(size*sizeof(float *));
        for(i=0;i<size;i++) entry[0][i] == 0.0;
        entry[1] = malloc(size*sizeof(float *));
        for(i=0;i<size;i++) entry[1][i] == 0.0;

return entry;
}

当我编译并运行程序时,它会正确地打印出文件中的行数,但是用于验证读取到数组 entry 中的数据的 printf 语句只会打印出全零,如下所示:

numlines: 252

0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00
0.000000E+00    0.000000E+00

我为 fscanf 尝试了不同的格式说明符,例如 %g、%e、%f、%G 等,但它们都给出了相同的结果。另外,我使用的是 Ubuntu 12.04 和 GCC 4.6。任何指出错误的地方将不胜感激。

卡蒂嘉。

最佳答案

你的初始循环:

while((c=fgetc(infile))!=EOF)
    if(c == '\n') numlines++;

读取整个输入文件(以确定数组的大小)。一旦你这样做了,你对 fscanf 的调用都会失败,因为你已经到了文件的末尾。

假设输入文件是可查找的(如果它是磁盘文件,则应该是可查找的),您可以使用 rewind()fseek() 返回到开始再读一遍。

顺便说一句,您对 %G%E 格式说明符的使用是有效的,但是 %g%e 更常见(并且应该以完全相同的方式工作)。

在引用 argv[1] 之前,您真的应该检查 argc 的值;如果在没有命令行参数的情况下调用,该程序可能会崩溃。您还应该检查 fopen() 是否成功,以及 fscanf() 返回 2 以指示它成功读取了两个数据项。

关于c - 使用 fscanf() 在 C 中以科学格式读取数字时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11252472/

相关文章:

c - 将 memcpy 与十六进制值结合使用

c++ - 使用 C/C++ 设置 Linux IP

linux - 在 Linux 上编程 VHDL?

linux - 使用 shell 脚本 (bash) 查找我的系统的特定接口(interface)的 IP 地址

django - 我正在尝试使用 Heroku CLI 在 Heroku 中部署我的 django 项目我遇到安装错误

c - 使用恒定大小的二维数组时获取 "execvp error: Bad address"

c - qSort 未对我的数组进行排序

c++ - 大内存块的快速内存分配

ubuntu - 我可以使用ubuntu 13.10在同一台PC上安装hadoop2及其服务吗?

ubuntu - JMeter:插件管理器在 Ubuntu 的选项 > 插件管理器中不显示任何更新