Чтение CSV-файла в структуру в C с помощью scanf - PullRequest
0 голосов
/ 25 августа 2018

У меня проблема с чтением из файла данных CSV в узел для бинарного дерева поиска в C. Кажется, что ни одна из данных на самом деле не читается в структуру.Код, который я использую сейчас, просто пытается прочитать одну строку данных из файла CSV, прежде чем я смогу масштабировать его, чтобы прочитать все это, но даже с этим я не получаю результаты.Я знаю, что в этом коде, вероятно, много крупных проблем, так как я не очень хорошо разбираюсь в языке, но любая оценка будет полезна.

typedef struct{
  struct bst_t *left;
  struct bst_t *right;
  data_t data;
} bst_t;

Вот моя функция чтения

void readdata(bst_t node){
  while(
  scanf("%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],
   %[^,],%[^,],%[^,],%[^,] ,[^,],%[^,],%[^,] ... ) == 14);
}

Вот моя функция печати

void printdata(bst_t node){
  printf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s \n"...);
}

однако мой вывод выглядит просто:

-bash-4.1$ print

,,,,,,,,,,.,(@,,▒

Еще одна дополнительная проблема, с которой мне еще предстоит столкнуться, заключается в том, что некоторые данные в файле будут иметьзапятые в записи, как бы я "игнорировал" эти запятые, чтобы они отображались как данные, а не как разделитель в файле?

Еще раз, любая помощь будет очень признательна.

РЕДАКТИРОВАТЬ: Здесь я вызываю функции: (т.е. основной)

int main(int argc, char *argv[]) {
bst_t node;
readdata(*node);
printdata(node);
return 0;

}

Новый код компилятора

print.c: In function 'main':
print.c:37: error: invalid type argument of 'unary *' (have 'bst_t')
print.c: In function 'readdata':
print.c:56: error: request for member 'node' in something not a structure     or union

Вот полный код:

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


#define MAXSTRING 128


typedef struct{
  struct bst_t *left;
  struct bst_t *right;
  struct data_t data;
} bst_t;

void readdata(bst_t *node);
void printdata(bst_t node);

int main(int argc, char *argv[]) {
    bst_t node;
    readdata(&node);
    printdata(node);
    return 0;
}


void readdata(bst_t *node){
  while(
  scanf("%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,] \n",...) == 14)

}

1 Ответ

0 голосов
/ 25 августа 2018

Функция чтения обновляет только локальную переменную node, которую она получает по значению в качестве аргумента.Вы должны передать указатель на вновь распределенную структуру:

void readdata(bst_t *node) {
    while (scanf(" %[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],[^,],%[^,],%[^,]",
                 node->data.ID, node->data.name, node->data.sex,
                 node->data.height, node->data.weight, node->data.team,
                 node->data.NOC, node->data.games, node->data.year,
                 node->data.season, node->data.city, node->data.sport,
                 node->data.event, node->data.medal) == 14) {
        continue;
    }
} 

Вы должны вызывать эту функцию следующим образом: main:

int main(int argc, char *argv[]) {
    bst_t node;
    readdata(&node);
    printdata(node);
    return 0;
}

Обратите внимание, что эта функция небезопасна: онане защищает от переполнения буфера.

Также обратите внимание, что он не может обрабатывать пустые поля или поля со встроенными запятыми.

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

РЕДАКТИРОВАТЬ: Исходный код, который вы опубликовали, имеет синтаксическую ошибку:

               node->data.event->node.data.medal) == 14)

Он должен читать:

               node->data.event, node->data.medal) == 14)
        continue;

Вы должны форматировать свой код более наглядно, вставляя операторы в 4 пробела и вставляя пробелы вокруг двоичных операторов и после ,.

Попробуйте эту версию readdata: (копирование и вставка с веб-страницы)

void readdata(bst_t *node) {
    while (scanf(" %[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],[^,],%[^,],%[^,]",
                 node->data.ID, node->data.name, node->data.sex,
                 node->data.height, node->data.weight, node->data.team,
                 node->data.NOC, node->data.games, node->data.year,
                 node->data.season, node->data.city, node->data.sport,
                 node->data.event, node->data.medal) == 14) {
        continue;
    }
} 
...