1

我昨天发布了一个关于我的代码的某个部分的问题。目的是基本上将 .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);
}
4

2 回答 2

2

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

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

PS 如果您要编写类似的函数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()

于 2013-01-18T20:06:36.063 回答
0

您在内存 (N) 中分配的浮点数比您需要的要多得多,因为您的 N 是文件中的字符数,而不是文件中的值数。另外,您是如何确定文件中有 300000 个值的?

于 2013-01-18T20:13:57.783 回答