首页 > 解决方案 > 从C中的文件流中获取列数据

问题描述

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

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

我得到的只是第一行的数据。怎么可能得到剩下的数据?

标签: cfilestreamfgets

解决方案


您可以使用strtok空格字符分隔每行中的数字。然后使用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

推荐阅读