gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:48 25 4
gpt4 key购买 nike

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

最佳答案

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

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

附言如果您要编写类似 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() 后检查错误。

关于c - 程序不接受文件中的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14406610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com