3

对于我正在做的这个大学项目(我过去曾为此发过几篇文章),这是某种社交网络,它需要用户交换消息的能力。

起初,我将数据结构设计为将所有消息保存在一个链表中,将消息大小限制为 256 个字符。但是,我认为如果我将消息保存在磁盘上并仅在需要时阅读它们,我的老师会更喜欢它们。当然,他们不会说他们喜欢什么,我需要做出选择并尽我所能证明我为什么走那条路。

要记住的一件事是,我只需要保存来自每个用户的最新 20 条消息,不再需要了。

现在我有一个哈希表作为收件箱,这将在用户配置文件中。此哈希表将按名称(发送消息的用户)进行索引。每个元素的值将是一个数据结构,包含一个包含 20 个元素的数组size_t(如我上面所说的 20 条消息)。这个想法是跟踪磁盘文件的偏移量和写入的字节数。然后,当我需要读取消息时,我只需要使用fseek()和读取必要的字节即可。

我认为这可以很好地工作......我可以只使用一个文件来保存来自网络中所有用户的所有消息。我说的是一个文件,因为一位同事问一位讲师关于独立保存每个用户的消息,他回答说这可能不是最好的方法,因为文件系统有它的限制。这就是为什么我正在考虑采用单文件路线。

但是,这带来了一个问题......因为我只需要保存最新的 20 条消息,所以当我达到这个限制时,我需要丢弃旧的消息。

我不知道该怎么做......我所知道的只是fread()fwrite()文件读取/写入字节。如何转到文件偏移量并说“嘿,删除以下 X 个字节”?即使我能做到这一点,还有另一个问题......低于那个偏移量的所有偏移量都将完全不同,我必须处理所有用户邮箱来解决问题。那会很痛苦...

那么,有什么建议可以解决我的问题吗?你有什么建议?

4

3 回答 3

2

不能随意删除文件中间的字节;唯一可行的方法是在没有它们的情况下重写整个文件。忽略以这种方式做事是否是个好主意的问题,如果您有固定长度的字段,一种解决方案是用最新的消息覆盖最旧的消息;这样,磁盘上消息的大小/位置不会改变,因此其他偏移量都不会受到影响。

编辑:如果您被允许使用外部库,那么制作一个简单的SQLite数据库可能是一个很好的解决方案。

于 2010-04-12T00:24:18.320 回答
0

你让你的生活变得比你需要的更复杂。

如果您的消息是 256 个字符,则使用 256 个字符的数组来保存每条消息。

使用 fwrite 将其写入磁盘,使用 fread 读取,通过将字符串的第一个字符更改为 \0(或其他任何您喜欢的字符)将其删除,然后将其写入磁盘。

以简单的结构(用户名/recno)保持消息的索引,并使用 fseek 在文件中跳转。您可以在写入新记录时强制下一个空闲记录(从文件开头开始读取并在您点击 \0 时停止)或在数组中保留空闲记录的索引并在写入时抓取其中一个一个新的(或者如果您的数组为空,则 fseek 到文件末尾并写入一条完整的新记录。)

于 2010-04-12T00:28:40.577 回答
0

为了完整起见,我想提出另一种解决方案:

字符串应该以空字节字符结尾"hello world\0",因此您可能会读取原始二进制数据,直到到达"\0". 其他数据类型具有固定位,请注意字节顺序(字节序)。

你也可以在每条消息之前定义一个有效负载,这样你就知道它的字符串长度:

"11hello world;2hi;15my name is loco"

因此,可以将原始片段视为数据字段。

于 2013-02-18T11:06:55.643 回答