Как читать эти смеси данных в C

Я должен хранить все данные в массиве. Как мне прочитать эти данные из файла?

120 5.0000000000000000E-01   -5.0000000000000000E-01  5.0000000000000000E-01  
5.0000000000000000E-01   -5.0000000000000000E-01  -5.0000000000000000E-01 
5.0000000000000000E-01   -5.0000000000000000E-01  1.6666666666999999E-01  
5.0000000000000000E-01   -5.0000000000000000E-01  -1.6666666666999999E-01 
-5.0000000000000000E-01

Данные представляют собой смесь целых чисел, чисел с плавающей запятой и экспонент. Пробелы между последовательными данными не постоянны, поэтому я не могу использовать прямую функцию fscanf(). Я также должен изменить их на целое, следовательно, я не могу найти альтернативу fscanf (), так как могу указать спецификатор типа как%e в аргументе fscanf (), а затем изменить их на целое число. Я пробовал fgetc() также. Пожалуйста, покажи мне путь.

редактировать.

Чтобы использовать fscanf () мне нужно иметь постоянное количество пробелов или запятых или что-либо между последовательными данными. Здесь количество пробелов между данными не является постоянным. Итак, мне нужно также реализовать пробел между ними. Вот почему я использовал fgetc() в части.

#include<stdio.h>

int main()
{
int i=0,c,a[13];
FILE *fp;
fp=fopen("test.txt","r");
if(fp==NULL)
{
    printf("Error");
}
else
{
    i=0;
    while(1)
    {
        c=fgetc(fp);
        //printf("\nc = %c",c);
        if(feof(fp))
        {
            break;
        }
        else if(c!=" ")
        {
            fscanf(fp,"%d",&a[i]);
            printf("%d\n",a[i]);
            i++;
        }
    }

}
fclose(fp);
return 0;
}

Файл данных составляет 2 МБ. Я только что опубликовал его часть. Другие части имеют числа с плавающей запятой, которые не являются экспонентами, как здесь.

2 ответа

Эта программа читает из файла и конвертирует токены в числа с плавающей точкой. Вы должны прочитать всю строку и токенизировать ее. Тогда вам просто нужно создать массив и добавить в массив в нужном месте в коде.

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

int main(void) {
    FILE *sp1;
    char line[256];
    double array[256];
    int i = 0;

    sp1 = fopen("data.txt", "r");
    while (1) {
        if (fgets(line, 150, sp1) == NULL) break;
        char *p = strtok(line, " ");
        while (p != NULL) {
            double fd = atof(p);
            array[i++] = fd;
            p = strtok(NULL, " ");
        }
    }

    for(int j=0;j<i;j++)
        printf("%f\n", array[j]);

    return 0;
}

data.txt

120 5.0000000000000000E-01   -5.0000000000000000E-01  5.0000000000000000E-01
5.0000000000000000E-01   -5.0000000000000000E-01  -5.0000000000000000E-01
5.0000000000000000E-01   -5.0000000000000000E-01  1.6666666666999999E-01
5.0000000000000000E-01   -5.0000000000000000E-01  -1.6666666666999999E-01
-5.0000000000000000E-01

Выход

120.000000
0.500000
-0.500000
0.500000
0.500000
-0.500000
-0.500000
0.500000
-0.500000
0.166667
0.500000
-0.500000
-0.166667
-0.500000

Попробуйте приведенный ниже код, он прочитает все числа из входного файла как двойные.

Пробелы между числами не имеют значения.

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

int main(){


    FILE * fp;
    double num;

    fp = fopen("input.txt", "r");

    if (fp == NULL){
        printf("Unable to open file, terminating ...");
        exit(1);
    }
    else {
        while( fscanf(fp, "%lf", &num) == 1){
            printf("%lf %e\n", num, num);
        }
        fclose(fp);
    }
    return 0;
}

input.txt: (добавлено еще несколько пробелов и цифр в вашем)

120 5.0000000000000000E-01     -5.0000000000000000E-01  5.0000000000000000E-01

5.0000000000000000E-01  -5.0000000000000000E-01                 -5.0000000000000000E-01

5.0000000000000000E-01   -5.0000000000000000E-01  1.6666666666999999E-01
5.0000000000000000E-01   -5.0000000000000000E-01  -1.6666666666999999E-01   17.3 16.55511


-5.0000000000000000E-01

Выход:

120.000000 1.200000e+02
0.500000 5.000000e-01
-0.500000 -5.000000e-01
0.500000 5.000000e-01
0.500000 5.000000e-01
-0.500000 -5.000000e-01
-0.500000 -5.000000e-01
0.500000 5.000000e-01
-0.500000 -5.000000e-01
0.166667 1.666667e-01
0.500000 5.000000e-01
-0.500000 -5.000000e-01
-0.166667 -1.666667e-01
17.300000 1.730000e+01
16.555110 1.655511e+01
-0.500000 -5.000000e-01
Другие вопросы по тегам