繁体   English   中英

从C中的文件读取的数据开头的大量数字

[英]Large number at the beginning of data read from a file in C

我有一个代码段,我想从其中读取txt文件中的列数据。 但是,每当我这样做时,--1.073742e + 008都会被附加到文件的开头。 我不知道它来自哪里或如何摆脱它。 由于此代码段是一个较大的程序的一部分,该程序旨在自动读取文件并将其传递给另一个应用程序,因此不能选择手动删除。 我目前的代码如下。

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

void main()
{
    FILE * fout;
    int n;
    float f1;
    float f2;
    float f3;
    float npx[5208];
    float npy[5208];
    float npz[5208];
    int v1;
    int i;
/*read node cordinates fron the file */
    /*char buffer[100];*/
    fout = fopen("z1_115k.out", "r");
    /*fgets(buffer,100,fout);*/ /* skip the first line*/
    while(feof(fout)==0)
    {
        fscanf(fout, "%d %e %e %e\n", &v1, &f1, &f2, &f3);
        npx[v1]=f1;
        npy[v1]=f2;
        npz[v1]=f3;
    }
    fclose(fout); 
    fout = fopen("writeout9.txt" , "w");
    for(i=0;i<5208;i++)
    {
        fprintf(fout, "%e",npy[i]);
        fprintf(fout, "\n");
    }
    fclose(fout);
    getch();
}

我正在尝试读取的文件如下所示

         1 -1.998999214E-04 -6.326398761E-06  7.987323916E-04 
         2 -1.993482729E-04  1.613270797E-05  8.020100649E-04 
         3 -1.998304651E-04  8.233274457E-06  7.735857507E-04 
         4 -9.247181879E-05  1.772655523E-04  6.779084215E-04 
         5 -7.928538980E-05  1.833699498E-04  6.915458362E-04 
         6 -9.789415344E-05  1.918512862E-04  6.868232158E-04 
         7 -1.943270909E-04 -4.729676220E-05  8.172317175E-04 
         8 -1.892633736E-04 -6.464808394E-05  8.175745024E-04 

我在第一列中得到的输出如下

-1.073742e+008
-1.998999e-004
-1.993483e-004
-1.998305e-004
-9.247182e-005
-7.928539e-005
-9.789415e-005
-1.943271e-004
-1.892634e-004

为什么我一开始会得到-1.073e + 08的值?

您正在使用文件最左列中给出的索引写入数组。 由于此文件的第一行以1开头,因此条目#0将保持未初始化状态。 这将导致您在打印npy[0]时看到的垃圾值。

另外,与此问题无关,您应该阅读为什么“ while(!feof(file))”总是错误的? 这可能会导致文件末尾的错误,以及对错误文件格式的不正确处理。 您的循环应如下所示:

while (fscanf(fout, "%d %e %e %e\n", &v1, &f1, &f2, &f3) == 4) ...

最后,您可能还想在写入数组索引之前检查它是否在范围内。

您的文件以数字1开头,因此您访问npx[1] 您的打印循环从0开始并访问npx[0] ,该值未设置值。

可能出现实际问题:您从索引1将值存储到数组,但从索引0打印。 由于未初始化数组,因此可以获取存储在存储单元中的任何内容。 您可以从读取的索引中减去1 (推荐,但首先读取 )。 或者,您从索引1打印值。 不建议这样做,因为您不是数组的第一个条目,并且这种行为在C和所有其他以0作为第一个索引的语言中并不常见。

但是您的代码还有许多其他问题:

  1. main的签名不符合该标准。 这将在返回时调用未定义的行为 实际上,您的编译器应发出警告。
  2. feof仅检查是否从上一个函数设置文件结束指示符。 检查,如果该文件是在结束自己!
  3. 始终检查可能返回错误情况的函数结果。 fopen是这样的功能, scanf另一个! 不进行测试可能会引起未定义的行为
  4. 使用前检查数组索引v1 那是来自一个不可靠的来源(甚至在您检查fscanf的结果时,甚至更多),任何越界访问都将调用未定义的行为
  5. (评论多于问题) getch是非标准的。

始终启用编译器警告并留意它们!

注意:在测试过程中,最好立即在读取循环中打印在读取循环中读取的值。

第一列是数组索引,这意味着它将从零开始,而不是一个。

您可以更改为

while(feof(fout)==0)
{
    fscanf(fout, "%d %e %e %e\n", &v1, &f1, &f2, &f3);
    npx[v1-1]=f1;
    npy[v1-1]=f2;
    npz[v1-1]=f3;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM