从 C 中的文件流中获取列数据

Getting column data from file stream in C

我有一个文件,其中写入了一列数据(例如"250\n 249\n..."。实际上,有250行数据,每行最多15位)。我希望从不同的文件中获取数据并对它们进行平均。但是,我不知道如何用单列获得如此大量的数据。我尝试了以下方法:

char str[80];\newline
FILE * abc;
abc=fopen("bromo.dat", "r");
fgets(str, 80, msd);
atof(str);

我得到的只是第一行的数据。如何获取其余数据?

您可以使用 strtok 将每行中的数字拆分为 space 个字符。然后使用您在代码中使用的 atof 函数将字符串转换为浮点数。

您应该使用二维数组存储文件中的所有数字,并使用另一个数组存储每一行​​中的数字:

 float number[250][15]; // maximum 250 line with at most 15 digits in each line
 int number_each_line[250] = {0}; // the number of digits in each line

完整的测试程序:

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

int main() {
    char str[80];
    float number[250][15];
    int number_each_line[250] = {0};
    FILE * fp;
    fp =fopen("bromo.dat", "r");
    if (!fp) {
        return -1;
    }
    int i = 0;
    while(fgets(str, 80, fp) && i < 250) {
        int j = 0;
        char *token = strtok(str, " ");
        while(token != NULL) {
            number[i][j] = atof(token);
            j++;
            token = strtok(NULL, " ");
        }

        number_each_line[i] = j;
        i++;
    }
    // print first 10 lines in file
    for(int k = 0; k < 10; k++) {
        for(int j = 0; j < number_each_line[k]; j++) {
            printf("%f  ", number[k][j]);
        }
        printf("\n");
    }
    fclose(fp);
}

测试输出:

bromo.dat:

1.2 1 4 5
2.1 2 6 7 8
3.5 3 2 3 5.3
2.1 4 6 7 8
2.1 5 6 7 8
2.1 6 6 7 8
2.1 8 6 7 8
2.1 9 6 7 8
2.1 10 6 7 8

./test
1.200000  1.000000  4.000000  5.000000                                                                                    
2.100000  2.000000  6.000000  7.000000  8.000000                                                                          
3.500000  3.000000  2.000000  3.000000  5.300000                                                                          
2.100000  4.000000  6.000000  7.000000  8.000000                                                                          
2.100000  5.000000  6.000000  7.000000  8.000000                                                                          
2.100000  6.000000  6.000000  7.000000  8.000000                                                                          
2.100000  8.000000  6.000000  7.000000  8.000000                                                                          
2.100000  9.000000  6.000000  7.000000  8.000000                                                                          
2.100000  10.000000  6.000000  7.000000  8.000000