在C语言中从文件流中获取列数据

问题描述 投票:0回答:1

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

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

我得到的只是第一行的数据。怎样才能得到其余的数据呢?

c filestream fgets
1个回答
0
投票

你可以使用 strtok 用空格分割每行的数字。然后使用 atof 函数,就像你在代码中使用的将字符串转换为浮点数一样。

你应该使用2D数组来存储文件中的所有数字,并使用另一个数组来存储每一行的数字。

 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
© www.soinside.com 2019 - 2024. All rights reserved.