Чтение данных с разделителями табуляции в массив в C - PullRequest
0 голосов
/ 29 мая 2019

У меня есть входной файл в текстовом формате, который выглядит следующим образом:

G:  5   10  20  30
C:  24  49  4.0 30.0

Я хотел бы установить каждый из них в массив, массив, соответственно.Я видел из этого ответа чтение входных параметров из текстового файла с C , способ чтения некоторых значений, но как бы получить массивы G и C?

РЕДАКТИРОВАНИЕ :

Если бы я удалил G: и C: из файла .txt, я мог бы просто запустить цикл for.

double *conc = (double*)malloc(properConfigs*sizeof(double));
double *G = (double*)malloc(properConfigs*sizeof(double));

for (int i=0;i<properConfigs;i++)
    fscanf(inputfile,"%lf", &G[i]);
for (int i=0;i<properConfigs;i++)
    fscanf(inputfile,"%lf", &conc[i]); 

Это будетработать, но я хотел бы иметь возможность учесть, что кто-то сохранил файл .txt в другом порядке или в какой-то момент добавил больше строк (с другими параметрами).

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Я не фанат scanf, и настоятельно рекомендую вам разобрать строку самостоятельно. Если вы настаиваете на использовании scanf, я рекомендую использовать для этого вариант sscanf, чтобы вы могли проверить строку заранее, чтобы увидеть, какой массив записать. Я не уверен, почему вы вообще используете именованные массивы. C не очень хорош в самоанализе, и вы можете сделать вашу программу более гибкой, не пытаясь связать свой ввод с конкретными символами. Что-то вроде:

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

#define properConfigs 4
void *Malloc(size_t s);
int
main(int argc, char **argv)
{
        FILE *fp = argc > 1 ? fopen(argv[1],"r") : stdin;
        double *G = Malloc( properConfigs * sizeof *G );
        double *C = Malloc( properConfigs * sizeof *G );
        int line_count = 0;
        char line[256];

        if( fp == NULL ) {
                perror(argv[1]);
                return 1;
        }
        while( line_count += 1, fgets( line, sizeof line, fp ) != NULL ) {
                double *target = NULL;
                switch(line[0]) {
                case 'G': target = G; break;
                case 'C': target = C; break;
                }
                if( target == NULL || 4 != sscanf(
                                line, "%*s%lf%lf%lf%lf",
                                target, target+1, target+2, target+3)) {
                        fprintf(stderr, "Bad input on line %d\n", line_count);
                }
        }
        for(int i=0; i < 4; i += 1 ) {
                printf ("G[%d] = %g\tC[%d] = %g\n", i, G[i], i, C[i]);
        }


        return ferror(fp);
}
void *Malloc(size_t s) {
        void *r = malloc(s);
        if(r == NULL) {
                perror("malloc");
                exit(EXIT_FAILURE);
        }
        return r;
}
0 голосов
/ 29 мая 2019

Похоже, ваша проблема atof() в c отбрасывает все пробелы после первого действительного числа.Если вы хотите получить все числа, вам придется разделить tmpstr2 и сделать каждый элемент отдельно в atof().

Вы можете использовать strtok, чтобы разбить его на токены, затем использовать atof() на каждом.

char temp[];
char *nums;
nums = strtok(temp, " \t");
int count = 0;
while (nums != NULL)
{
    G[count] = atof(chrs);
    nums = strtok(NULL, " \t");
    count++;
}

Конечно, если вы заранее знаете, сколько чисел вы собираетесьget.

Просмотреть эту статью для получения дополнительной информации: Разделить строку с разделителями в C

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...