Как читать эти смеси данных в 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