2016-10-15 3 views
0

Учитывая текстовый файл с полуизвестным форматом. Всего символов в 1 строке будет меньше 1000. Цинтегер - это просто нормальное целое число, но оно служит другой цели. Строка завершается через пробел.Создание массивов структур с использованием текстового файла

Строка ZInteger Integer Integer

Строка ZInteger Integer Integer Integer Integer

Таким образом, ее слово с последующим числом следуют парами чисел, но случайное количество пар.

Я хочу хранить строки, Цинтегер и целые пары для каждой строки в структуре данных.

Итак, я попробовал массив, где A [1] будет структурой, которая имеет String, Zinteger и пары целых чисел, которые будут другой структурой, которая имеет целую пару. Вот что я пытался.

typedef struct { 
int num1; 
int num2; 
} ints_t; 

typedef struct { 
char term[1000]; 
int quantity(bad variable name, could be called alpha); 
ints_t *pairs; 
} info_t; 

Справка приветствуется.

EDIT: Хорошо, поэтому я слишком открыт. Так что просто спросите простой вопрос: две структуры, которые я сделал жизнеспособными, и если не так, как я могу сделать их жизнеспособными и как я могу выделить структуры и массив.

+0

Это очень много вопросов в одном, и, честно говоря, самый быстрый способ ответить на них - написать код для вас - чего мы не будем делать, поскольку это не бесплатная служба написания кода. Возможно, вам следует начать с простого чтения вещей в структурах и печати, чтобы проверить, есть ли у вас это право, и тогда вы должны попытаться поместить структуры в массивы. Затем задайте точные, ответные вопросы (или нет). На все ваши индивидуальные вопросы, которые, скорее всего, уже много раз отвечали на этом сайте, трюк разбивает вашу проблему на более простые проблемы, которые можно найти). –

+1

Соответствующая закрытая причина голосования, которую я выбрал, - ** Есть либо слишком много возможных ответов, либо хорошие ответы будут слишком длинными для этого формата. Пожалуйста, добавьте детали, чтобы сузить набор ответов или изолировать проблему, на которую можно ответить в нескольких параграфах. ** –

+1

Что такое String и что такое ZInteger. Есть ли ограничение на размер строки? Как строка заканчивается в текстовом файле? – cup

ответ

1

Ваша структура выглядит разумным, однако, отсутствует поле для хранения счетчик для числа пар:

typedef struct { 
    int num1; 
    int num2; 
} int_pair_t; 

typedef struct { 
    char term[1000]; 
    int zinteger; /* so named to avoid confusion */ 
    int n_pairs; 
    int_pair_t *pairs; 
} info_t; 

Учитывая максимум 1000 символов в каждой строке, и предполагая строку один символ с последующим пробел, за которым следует одна цифра Zinteger, 332 - наибольшее количество пар (одна цифра с последующим пробелом, за которым следует одна цифра), которые могут быть размещены в остальных символах.

Таким образом, вы можете использовать массив фиксированного размера в int_pair_t pairs[332], в котором пары из одной линии чтения, а также строку для term и int сек для подсчета Zinteger и пары. После того, как вы прочтете строку, вы можете скопировать данные о парах в недавно созданную структуру info_t точно соответствующего размера и добавить ее к любой коллекции, которую вы имеете для строк.

Если вы не слишком заботятся об использовании памяти (это меньше, чем 3KB в каждой строке), вы можете пропустить таНос и копировать, а просто выделить размерный массив фиксированного в info_t структуры:

#define MAX_PAIRS 332 

typedef struct { 
    char term[1000]; 
    int zinteger; /* so named to avoid confusion */ 
    int n_pairs; 
    int_pair_t pairs[MAX_PAIRS]; 
} info_t; 

Ваш оригинальный вопрос также спросил, как читать данные из текстового файла. Прочтите строку данных из файла в буфер char. Затем вы можете использовать strtok() для обработки полей из файла, используя пробел в качестве разделителя. Вы можете комбинировать это с sscanf(), чтобы извлечь первые 2 поля, если хотите, и обработать оставшиеся поля с помощью strtok.

+0

Да, я могу просто выделить массив фиксированного размера, но мне нужно динамически выделять память с помощью malloc и realloc. Это то, что у меня больше всего неприятностей с атмом. – Diablo

+0

@Diablo: почему вы должны использовать 'realloc'? Я сомневаюсь, что ваше приложение не может позволить себе 3KB для чтения данных из файла. Если вы не можете себе это позволить, тогда вы можете динамически выделять память для чтения в строке файла и освобождать ее после того, как файл будет считан. – mhawke

+0

Хорошо, поэтому я просто прочитал его снова, а ограничение 1000character для каждого термина в строке. Извините, поэтому я не знаю, сколько будет условий. Как вы думаете, подходящий размер для Max_Pairs был бы не слишком маленьким или слишком большим? Как 5000? – Diablo