簡體   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