如何以表格格式在C中存储数据?

时间:2010-05-04 07:25:52

标签: c data-structures

我想以表格格式将数据存储在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 个答案:

答案 0 :(得分:3)

您可能会混合两个不同的问题:

  1. 如何组织程序中的数据(内存中) - 这是使用结构的部分。
  2. 如何序列化数据,即将数据存储在外部存储器中,例如在文件中。这是关于“表格”格式的部分,它表示带有由制表符分隔的字段的文本。
  3. 如果IP和域经常在您的程序中聚集在一起,那么使用结构或类(在C ++中)是合理的。关于你的例子,我不知道对域名长度的限制,但“20”肯定是不够的。我建议在这里使用动态分配的字符串。对于存储IP(v4)地址,您可以使用32位无符号整数 - 字符不足。您是否打算支持IP v6?然后你需要128位地址。

    在C(和C ++)中,没有像C#,Java,Python这样的几乎所有动态(或“托管”)语言中的内置序列化工具。因此,通过定义结构,您不会自动获得编写/重新编写数据的方法。因此,您应该使用一些库进行序列化,或者编写自己的库来读取/写入数据。

答案 1 :(得分:2)

存储方法至少部分取决于您将如何处理信息。如果只是将其读入并再次打印出来,则可以严格按文本处理。

但是,网络程序通常会使用此类数据。查看系统标头文件netinet/in.harpa/inet.hsys/socket.h中的结构或参见inet_aton()的手册页

答案 2 :(得分:2)

结构是要走的路。使用足够大小的数组。 IPV4地址需要16个字符,域名最多需要255个字符。

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

答案 3 :(得分:0)

不幸的是我无法发表评论。但就Amarghosh的答案而言,使用固定长度数组的字段可以很好地解决这个问题,因为两个集合(如果域只是顶级)数据的长度有限(ip地址为15个字符[假设为IPv4],并且每个域名的标签有63个字符的ascii限制。)

答案 4 :(得分: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。