Как я могу хранить данные в C в табличном формате? - PullRequest
1 голос
/ 04 мая 2010

Я хочу хранить данные в 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];
};

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

Ответы [ 5 ]

3 голосов
/ 04 мая 2010

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

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

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

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

2 голосов
/ 04 мая 2010

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

struct table
{
    char ip_addr[16];
    char domain_name[255];
};
2 голосов
/ 04 мая 2010

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

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

.
0 голосов
/ 04 мая 2010

Существует две проблемы в представлении табличных данных:
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.

0 голосов
/ 04 мая 2010

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

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