程序不接受文件中的所有值

时间:2013-01-18 19:52:52

标签: c

我昨天发布了一个关于我的代码的某个部分的问题。目的是基本上将.dat文件中的数据值扫描到数组中,打印值,同时计算文件中的值。

听起来很简单,但我的程序似乎只打印了一定数量的值。更具体地说,对于包含超过300000个值的数据文件,它只打印最后的20000而不打印任何其他内容。

所以我离开了它,完成了我的其余代码,现在它是我必须排序的最后一部分。我做了一些更改,并尝试实际打印输出.dat文件,所以我可以看到我得到了什么。顺便说一句,代码如下。

最初我假设它可能与我的数组的内存分配有关(在将整个代码放在一起时会出现分段错误)所以我创建了一个外部函数来计算值的数量(这是有效的)。

我现在唯一的问题是它仍然只选择打印20000个值,然后其余的都是0。我想也许它与这种类型有关,但它们都含有7 dps的科学记数法。以下是一些值的示例:

   8.4730000e+01   1.0024256e+01
   8.4740000e+01   8.2065599e+00
   8.4750000e+01   8.3354644e+00
   8.4760000e+01   8.3379525e+00
   8.4770000e+01   9.8741315e+00
   8.4780000e+01   9.0966478e+00
   8.4790000e+01   9.4760274e+00
   8.4800000e+01   7.1199807e+00
   8.4810000e+01   7.1990172e+00

任何人都知道我哪里出错了?对于这个长期的问题,我感到很遗憾,这只是在最后一天左右让我烦恼,无论我改变什么,似乎没有任何帮助。任何形式的投入将不胜感激。

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

int count(int);

const char df[]="data_file.dat";
const char of[]="output_file.dat";

int main(int argc, char *argv[])
{
    FILE *input, *output;
    int   i, N;
    float *array;

    N = count(i);

    input = fopen(df, "r");
    output = fopen(of, "w");

    array = (float*)malloc(N*sizeof(float));

    if((input != (FILE*) NULL) && (output != (FILE*) NULL))
    {
        for(i = 0; i < N; i++)
        {
            fscanf(input, "%e", &array[i]);
            fprintf(output, "%d %e\n", i, array[i]);
        }

        fclose(input);
        fclose(output);
    }
    else
        printf("Input file could not be opened\n");

    return(0);
}

int count(int i)
{
    FILE *input;
    input = fopen(df, "r");

    int N = 0;

    while (1)
    {
        i = fgetc(input);
        if (i == EOF)
            break;
        ++N;
    }

    fclose(input);

    return(N);
}

2 个答案:

答案 0 :(得分:2)

你最大的问题是count()不计算浮动值;它计算文件中有多少个字符。然后,您尝试循环并调用fscanf()次,而不是文件中的值。第一次,fscanf()找到一个浮点值并扫描它;但是一旦循环到达文件末尾,fscanf()将返回EOF状态。 fscanf()似乎可以在返回EOF时将浮点值设置为0.0

我建议你重写,这样你就不会尝试预先计算浮点值。编写一个循环,重复调用fscanf()直到它返回EOF结果,然后跳出循环并关闭文件。

P.S。如果要编写类似count()的函数,则应将文件名作为参数传递,而不是对其进行硬编码。你的count()版本采用整数参数,但只是忽略了值;相反,只需在count()内声明一个临时变量。

编辑:好的,这是一个完整的工作程序来解决这个问题。

#include <stdio.h>

int
main(int argc, char **argv)
{
    FILE *in_file, *out_file;
    unsigned int i;

    if (argc != 3)
    {
        fprintf(stderr, "Usage: this_program_name <input_file> <output_file>\n");
        return 1; // error exit with status 1
    }

    in_file = fopen(argv[1], "r");
    if (!in_file)
    {
        fprintf(stderr, "unable to open input file '%s'\n", argv[1]);
        return 1; // error exit with status 1
    }

    out_file = fopen(argv[2], "w");
    if (!out_file)
    {
        fprintf(stderr, "unable to open output file '%s'\n", argv[2]);
        return 1; // error exit with status 1
    }


    for (i = 0; ; ++i)
    {
        int result;
        float x;

        result = fscanf(in_file, "%e", &x);
        if (1 != result)
            break;

        fprintf(out_file, "%d %e\n", i, x);
    }

    return 0; // successful exit
}

请注意,此版本不需要分配大型数组;它只需要一个临时的浮点变量。也许你的程序需要存储所有浮点值。在这种情况下,编写一个使用类似于上述循环的循环的count()函数,使用fscanf()计算浮点值。

另请注意,此程序在致电fopen()fscanf()后会检查错误。

答案 1 :(得分:0)

您在内存(N)中分配的浮动数远远超过您需要的数量,因为N是文件中字符的数量,而不是其中的值数。 另外,您是如何确定文件中有300000个值的?