статически заполняет огромную структуру - PullRequest
0 голосов
/ 06 августа 2010

У меня есть огромные данные в таблице Excel.Мне нужно подготовить структуру для этих данных и заполнить данные.Я могу сделать это двумя способами.

  1. статически заполнить структуру во время инициализации структуры struct x a[] = { }

  2. Динамически заполнить структуру путем выделения памяти изаполнив его функцией.

Моя структура также выглядит немного сложной.Как мне заполнить эту структуру?

Одна запись таблицы Excel выглядит следующим образом:

region name, list of languages supported, list of encodings supported

Как определить структуру для таких данных и заполнить ее?

Ответы [ 6 ]

1 голос
/ 06 августа 2010

Согласно вашим комментариям, вы работаете только с шестидесяти строками.Это не огромный!Начните печатать!:-)

Но давайте работать умнее и немного применить эмпирическое эмпирическое правило, чтобы компьютер делал скучные вещи и следил за обновлением данных по мере развития данных.Я предлагаю вам написать отдельную программу для извлечения данных из таблицы Excel и создания из нее файла заголовка C, чтобы вы могли просто #include определить.После этого вы сможете перестроить определение структуры из исходного кода с помощью правила make-файла.(В зависимости от правил, в которых вы работаете, вы можете создать вспомогательную программу, отличную от C, поскольку это всего лишь инструмент разработчика.)

Последнее замечание; намного проще генерировать статические данные в виде массивов структур (которые могут содержать массивы структур и т. д.), чем создавать связанные списки.

0 голосов
/ 24 февраля 2011

Вы можете сгенерировать структуру C из CSV, используя следующий скрипт Python:

import csv, sys
csvfile = open("eclipses.csv", "rb")
dialect = csv.Sniffer().sniff(csvfile.read(1024))
print "Dialect:", dialect
csvfile.seek(0)
spamReader = csv.reader(csvfile, dialect=dialect)
writer = csv.writer(sys.stdout, quoting=csv.QUOTE_ALL, lineterminator=",\n")
writer.writerows(spamReader)
0 голосов
/ 06 августа 2010

Вы мало что сказали о платформе, для которой разрабатываете. Если ваш компилятор совместим с C99, вы можете инициализировать саму struct именованными инициализаторами следующим образом

char *fullname0 = ...
char *phone = ...
.
struct x a[] = {
 [0] = { .fname = fullname0, .phn = phone }
 [1] = { .fname = fullname1, .phn = phone }
};

Если при этом все очень похоже, то лучше всего написать макрос для инициализации каждого отдельного struct.

#define X_INITIALIZER(NAME, PHONE) { .fname = NAME, .phn = PHONE }
0 голосов
/ 06 августа 2010

Если данные не изменятся во время выполнения, вы должны обязательно использовать статическую инициализацию и объявить объект const. На любой современной платформе это приведет к тому, что операционная система будет обмениваться страницами с копией исполняемого файла в кеше файловой системы, что означает, что она фактически не использует физическую память (если памяти мало, страницу можно сбросить и перечитать из исполняемого файла, если это необходимо; его не нужно хранить / перезаписывать на диск).

0 голосов
/ 06 августа 2010

Если каждая строка содержит только 3 столбца, сохраните его как файл CSV Иметь структуру с 3 переменными как char * объявить 3 массива символов Затем откройте файл Читать каждую строку, используя fgets Используйте sscanf для чтения строки в массивах. Используя размер прочитанных значений, выделите память и сохраните ее в структуре.

0 голосов
/ 06 августа 2010

Вы не сможете сделать 1, если данные вообще динамические. Поместить его в инициализацию структуры в коде означает просто скопировать все данные в исходный файл из листа Excel. Я предполагаю, что это невозможно, так как вы сказали, что это было огромно. Вам придется перейти к варианту 2. Если, конечно, у вас нет возможности использовать библиотеку базы данных, которая может читать электронную таблицу, это может быть вашим лучшим выбором.

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