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