我想以表格格式将数据存储在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];
};
如果没有,请澄清一下?
答案 0 :(得分:3)
您可能会混合两个不同的问题:
如果IP和域经常在您的程序中聚集在一起,那么使用结构或类(在C ++中)是合理的。关于你的例子,我不知道对域名长度的限制,但“20”肯定是不够的。我建议在这里使用动态分配的字符串。对于存储IP(v4)地址,您可以使用32位无符号整数 - 字符不足。您是否打算支持IP v6?然后你需要128位地址。
在C(和C ++)中,没有像C#,Java,Python这样的几乎所有动态(或“托管”)语言中的内置序列化工具。因此,通过定义结构,您不会自动获得编写/重新编写数据的方法。因此,您应该使用一些库进行序列化,或者编写自己的库来读取/写入数据。
答案 1 :(得分:2)
存储方法至少部分取决于您将如何处理信息。如果只是将其读入并再次打印出来,则可以严格按文本处理。
但是,网络程序通常会使用此类数据。查看系统标头文件netinet/in.h
,arpa/inet.h
和sys/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。