C-从文件中读取大量数据

C-从文件中读取大量数据,c,file,floating-point,C,File,Floating Point,我有一个包含大量数字的文件,比如-7.47004e-16,我正在尝试使用 fscanf(rhs, "%f", &numbers[i]);" 这是一个while循环。但当我们有一个上面提到的数字时,这就不起作用了 这是不是因为人数太多而不起作用?或者这不是数字格式的e的工作原因 你能推荐一些正确的方法吗 谢谢 注意:数字是浮点数组,rhs是文件名。该文件每行有一个数字,有些数字的格式与上面相同,有些数字要小得多,例如,-1.88493 代码如下: int main( int argc,

我有一个包含大量数字的文件,比如-7.47004e-16,我正在尝试使用

fscanf(rhs, "%f", &numbers[i]);" 
这是一个while循环。但当我们有一个上面提到的数字时,这就不起作用了

这是不是因为人数太多而不起作用?或者这不是数字格式的e的工作原因

你能推荐一些正确的方法吗

谢谢

注意:数字是浮点数组,rhs是文件名。该文件每行有一个数字,有些数字的格式与上面相同,有些数字要小得多,例如,-1.88493

代码如下:

int main( int argc, char *argv[])
{
    FILE *rhs, *output;
    int niter, n, n1;
    // counters
    int i = 0, j = 0, k, m, p;

    rhs = fopen(argv[1], "r");
    // ab+ opens file for writting and creates the file if need be
    output = fopen(argv[2], "ab+");
    niter = atoi(argv[3]);

    // check if files open up or not, if not exit.
    if((rhs == NULL) || (output == NULL))
    {
        printf("Error Opening files.\n");
        exit(1);
    }

    // read in N
    fscanf(rhs, "%d", &n);

    // initialize n1
    n1 = n + 1;

    // generate array to hold values from rhs file
    long double *numbers = (long double *)malloc(sizeof(long double) * ((n1)*(n1)));
    long double *y = (long double *)malloc(sizeof(long double) * ((n1)*(n1)));
    long double *f = (long double *)malloc(sizeof(long double) * ((n1)*(n1)));
    long double *yp = (long double *)malloc(sizeof(long double) * ((n1)*(n1)));

    // get numbers and store into array
    for(i = 0; i <= n; i++)
    {
        for(j = 0; j <= n; j++)
        {
            fscanf(rhs, "%Lf", &numbers[i]);
            printf("i = %d, number = %Lf\n", i, numbers[i]);
        }
    }

    for(k = 0; k < niter; k++)
    {
        smooth(n, y, yp, f);
    }

    fclose(rhs);
    free(numbers);
    free(y);
    free(f);
    free(yp);

    return 0;

}

对于IEEE754单精度浮点来说,这个特定的数字不是太大,所以应该可以

为了增加射程和精度,我会使用双倍我自己,但这是我个人的偏好

有一件事我想澄清:你说rhs是一个文件名。我希望它真的是从fopen返回的文件句柄,否则会带来一个大问题:-

此外,我假设您的意思是文件每行有一个数字,而不是每个文件

作为示例,请参阅下面的文本,其中显示了一个输入文件、使用fscanf的C程序和输出,以查看此方法是否正常工作:

pax> cat qq.in
    -7.47004e-16
    3.14159
    2.718281828459
    42

pax> cat qq.c
    #include <stdio.h>
    #include <math.h>

    int main (void) {
        float f;
        FILE *fin = fopen ("qq.in", "r");
        while (fscanf (fin, "%f", &f) == 1)
            printf ("    %f %e\n", f, f);
        fclose (fin);
        return 0;
    }

pax> ./qq
    -0.000000 -7.470040e-16
    3.141590 3.141590e+00
    2.718282 2.718282e+00
    42.000000 4.200000e+01

对于IEEE754单精度浮点来说,这个特定的数字不是太大,所以应该可以

为了增加射程和精度,我会使用双倍我自己,但这是我个人的偏好

有一件事我想澄清:你说rhs是一个文件名。我希望它真的是从fopen返回的文件句柄,否则会带来一个大问题:-

此外,我假设您的意思是文件每行有一个数字,而不是每个文件

作为示例,请参阅下面的文本,其中显示了一个输入文件、使用fscanf的C程序和输出,以查看此方法是否正常工作:

pax> cat qq.in
    -7.47004e-16
    3.14159
    2.718281828459
    42

pax> cat qq.c
    #include <stdio.h>
    #include <math.h>

    int main (void) {
        float f;
        FILE *fin = fopen ("qq.in", "r");
        while (fscanf (fin, "%f", &f) == 1)
            printf ("    %f %e\n", f, f);
        fclose (fin);
        return 0;
    }

pax> ./qq
    -0.000000 -7.470040e-16
    3.141590 3.141590e+00
    2.718282 2.718282e+00
    42.000000 4.200000e+01

我不认为这是float的大小限制,因为它最多可以代表2e−126,约1.18*10e−38也许你在打印时没有指出浮点的精度

试着这样打印出来:

printf("%.30f\n", f);

我不认为这是float的大小限制,因为它最多可以代表2e−126,约1.18*10e−38也许你在打印时没有指出浮点的精度

试着这样打印出来:

printf("%.30f\n", f);
SSCCE 注意,代码检查转换是否成功;您应该始终这样做,正确的测试如图所示-您是否获得了正确的成功转换次数。在不运行EOF的情况下,转换可能会失败,因此针对EOF的测试是不正确的。

SSCCE
注意,代码检查转换是否成功;您应该始终这样做,正确的测试如图所示-您是否获得了正确的成功转换次数。在不运行EOF的情况下进行转换可能会失败,因此针对EOF的测试是不正确的。

浮点类型比浮点类型多,比如double甚至long double。所以这与数字格式中的e无关?您的fscanf行看起来不错,并且可以读取带有e的数字,因此,错误可能在其他地方。请显示仍然存在相同问题的最小工作程序。您的代码使用长双精度和%Lf格式;为什么你的问题是关于浮动和%f?至少你的格式是准确的。你没有检查你的输入是否有效;始终检查来自fscanf的返回值。为什么输出文件模式为ab+?这个代码包含了很多多余的内容;这不是一个SSCCE,让它工作起来。谢谢大家。浮点类型比浮点类型多,比如double甚至long double。所以这与数字格式中的e无关?您的fscanf行看起来不错,并且可以读取其中包含e的数字,因此错误可能在其他地方。请显示仍然存在相同问题的最小工作程序。您的代码使用长双精度和%Lf格式;为什么你的问题是关于浮动和%f?至少你的格式是准确的。你没有检查你的输入是否有效;始终检查来自fscanf的返回值。为什么输出文件模式为ab+?这个代码包含了很多多余的内容;这不是一个SSCCE,让它工作起来。谢谢大家。