2010-05-04 2 views
1

Я хочу хранить данные в C в табличном формате. У меня возникают трудности в связи со следующим. Может кто-нибудь помочь?Как хранить данные на C в табличном формате?

Например: Я хочу хранить данные, какие должны быть идеальным способом хранения в C?

IP Address    Domain Name 
1.) 10.1.1.2    www.yahoo.com 
2.) 20.1.1.3    www.google.com 

Должен ли я использовать конструкции? Скажите, например?

struct table 
{ 
    unsigned char ip address; 
    char domain_name[20]; 
}; 

Если нет, уточните пожалуйста?

ответ

2

Способ хранения зависит, по крайней мере, частично от того, что вы собираетесь делать с информацией. Если это просто прочитать его, а затем распечатать его снова, вы можете обработать его строго как текст.

Однако сетевые программы часто используют этот тип данных. Смотрите структуры в заголовочных файлах системы netinet/in.h, arpa/inet.h и sys/socket.h Или посмотреть страницу человека для inet_aton()

2

Структуры путь. Используйте массивы достаточно большого размера. Адреса IPV4 принимают 16 символов, а имена доменов занимают максимум 255 символов.

struct table 
{ 
    char ip_addr[16]; 
    char domain_name[255]; 
}; 
+0

Почему вы думаете, что использование указателей - хорошая идея? – 2010-05-04 09:43:46

+0

@Neil Длина доменных имен не всегда будет в пределах 20 - они варьируются от 'bit.ly' до очень длинных, и я предполагаю, что выделение памяти в кучу по мере необходимости будет лучше, чем массив [MAX_LENGTH], который будет есть (похоже, что у него много предметов - из-за того, что он считал его «таблицей») – Amarghosh

+0

@Neil Можете ли вы сказать мне, почему это не очень хорошая идея? – Amarghosh

3

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

  1. Как организовать данные в вашей программе (в памяти) - это часть об использовании структур.
  2. Как сериализовать данные, то есть хранить их во внешнем хранилище, например. в файле. Это часть о «табличном» формате, который подразумевает текст с полями, разделенными вкладками.

Если IP и домен часто объединяются в вашу программу, разумно использовать для этого структуру или класс (на C++). Что касается вашего примера, я не знаю ограничений на длину имени домена, но «20» будет определенно недостаточным. Я бы предложил использовать динамически выделенные строки здесь. Для хранения адреса IP (v4) вы можете использовать 32-битный неподписанный int-char. Вы также собираетесь поддерживать IP v6? то вам понадобится 128 бит для адреса.

В C (и C++) нет встроенного средства сериализации, подобного одному практически на каждом динамическом (или «управляемом») языке, таком как C#, Java, Python. Поэтому, определяя структуру, вы автоматически не получаете методы для записи/реиндикации ваших данных. Поэтому вы должны использовать некоторую библиотеку для сериализации или написать свой собственный для чтения/записи ваших данных.

0

К сожалению, я не могу комментировать. Но в отношении ответа Амархоша эта проблема будет идеально решена с использованием массивов фиксированной длины для полей, поскольку оба набора (если только домен является только верхним) данных имеют ограниченную длину (15 символов для ip-адреса [при условии, что IPv4], и есть 63 символов ограничение ASCII на этикетку для доменных имен)

+0

У вас есть ссылка для символа 63 ограничение? Я думал, что это 255 (включая терминатор NULL). –

+0

После некоторых исследований вы, вероятно, правы. Однако большинство регистраторов доменных имен, связанных с ICANN, ограничивают его до 63 символов на ярлык. Общее имя домена не может превышать 255 символов. – NFA

0

есть два вопроса, в представлении табличных данных:.
1. Представляющего ряд
2. Представление много строк.

В вашем примере, строка может быть представлена:

struct Table_Record 
{ 
    unsigned char ip_address[4]; 
    char   domain_name[MAX_DOMAIN_LENGTH]; 
}; 

Я решил использовать длину фиксированного поля для имени домена. Это упростит обработку.

Следующий вопрос - как структурировать строки. Это решение, которое вам нужно будет сделать. Самое простое предложение - использовать массив. Тем не менее, массив имеет фиксированный размер и должен быть перераспределены, если есть больше записей, чем размер массива:

struct Table_Record table[MAX_ROWS]; 

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

Альтернативные полезные структуры данных - это карты (ассоциативные массивы) и деревья (хотя многие карты реализованы с использованием деревьев). Карта позволит вам получить значение для заданного ключа. Если ключ является IP-адресом, карта вернет доменное имя.

Если вы собираетесь читать и записывать эти данные с использованием файлов, я предлагаю использовать базу данных, а не писать свои собственные. Многие рекомендуют SQLite.

Смежные вопросы