簡體   English   中英

如何從文件中讀取大量的浮點數?

[英]How read a large number of float from file?

我有一個帶有大量數字的文件,我需要讀取每一行,然后將該行中的每個數字放入數組中。

這是我文件的兩行:

  7.7560198e+002  8.2334910e+002  9.7819197e+002  1.4330775e+003  3.0535763e+003  3.3218925e+003  1.7164341e+003  3.1848433e+003  4.9317846e+002  3.4466984e+002  4.7654154e+002  4.9282917e+002  9.5322001e+001  1.2369945e+002  5.3310001e+001  1.0394150e+002  3.1919280e+003  2.1591746e+003  2.1608040e+003  3.6585112e+003

  7.1244665e+002  1.4142187e+003  1.7148456e+003  1.3126353e+003  3.4328919e+003  2.8380069e+003  2.8432808e+003  3.6142229e+003  3.3866501e+002  3.9236491e+002  5.0149915e+002  5.9447907e+002  1.3568213e+002  5.9164038e+001  7.1649000e+001  1.3451865e+002  2.2922576e+003  1.8212714e+003  2.9237970e+003  5.1605066e+003

我嘗試使用以下代碼:

FILE *f = fopen(pathInput,"r");
if(f==NULL) {
    printf("Error\n");
    return -1;
}

int i, j, columnsNumber=0, rowsNumber=0;
char c; 
c = fgetc(f);

// count number of column with the first line
for(i=0;c != '\n'; i++) {
    if (c==' ') {
        while(c==' ')
            c = fgetc(f);
        numCol++;
    }
    c = fgetc(f);
}

// count the rows
while(!feof(f)){
    c = fgetc(f);
    if(c == '\n'){
        rowsNumber++;
    }
}

float input[(rowsNumber)* columnsNumber];

for(j=0; j< rowsNumber;j++){
    for (i = 0; i < columnsNumber; i++){
        fscanf(f, "%f ", input[i] );
    }
}

for(i=0;i<10; i++){
    printf("%f\n", input[i]);
}

fclose(f);

但這不起作用,我收到此警告:

warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float *’ [-Wformat=]
         printf("%f\n", input[i]);

在代碼中,您將創建一個指向浮點數的指針數組。 您實際上正在尋找創建一個浮點數數組。 該聲明如下所示。 注意缺少float *

float input[rowsNumber * columnsNumber];

屆時,您將從fscanf()得到警告。 您應該將指針傳遞給已分配的內存。 所以:

fscanf(f, "%f ", &input[j*columnsNumber + i]);

而且,您還會遇到問題,因為您嘗試兩次讀取文件。 您需要關閉並重新打開文件,或者使用fseek()將文件重置為在文件的開頭。

最后,我對此不是100%的確定,但是我認為在計算一列中的浮點數與一行中的浮點數之間,您可能會錯過一個'\\n'字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM