对于我正在做的这个大学项目(我过去曾做过几个帖子),这是某种社交网络,它需要用户交换信息的能力。
首先,我设计了我的数据结构来将所有消息保存在链表中,将消息大小限制为256个字符。但是,我认为如果我将消息保存在磁盘上并且仅在需要时才读取它们,我的教师会更喜欢。当然,他们不会说他们喜欢什么,我需要做出选择并证明我能够做到最好的原因。
要记住的一件事是我只需要保存每个用户的最新20条消息,不再需要。
现在我有一个充当收件箱的哈希表,这将在用户配置文件中。此哈希表将按名称(发送消息的用户)编制索引。每个元素的值将是一个数据结构,其中包含一个size_t
数组,其中包含20个元素(如上所述的20条消息)。我们的想法是跟踪磁盘文件的偏移量和写入的字节数。然后,当我需要阅读消息时,我只需要使用fseek()
并读取必要的字节。
我认为这可以很好地工作......我只能使用一个文件来保存来自网络中所有用户的所有消息。我说的是一个单独的文件,因为一位同事要求教师单独保存来自每个用户的消息,他回答说这可能不是最好的方法,因为文件系统有限制。这就是为什么我想要单一文件路径。
然而,这提出了一个问题...因为我只需要保存最新的20条消息,所以当我达到这个限制时,我需要丢弃旧的消息。
我不知道如何做到这一点...我所知道的只是fread()
和fwrite()
从/向文件读/写字节。如何进入文件偏移量并说“嘿,删除以下X字节”?即使我能做到这一点,还有另外一个问题......所有偏移都低于那一个将完全不同,我将不得不处理所有用户邮箱来解决问题。这将是一种痛苦......
那么,有什么建议可以解决我的问题吗?你有什么建议?
答案 0 :(得分:2)
你不能随意删除文件中间的字节;唯一有效的方法是在没有它们的情况下重写整个文件。无论是否采用这种方式做事是个好主意,如果你有固定长度的字段,一个解决办法就是用最新的消息覆盖最旧的消息;这样,磁盘上消息的大小/位置不会改变,因此其他任何偏移都不会受到影响。
编辑:如果您被允许使用外部库,那么创建一个简单的SQLite db可能是一个很好的解决方案。
答案 1 :(得分:0)
你的生活方式比你需要的更复杂。
如果您的消息是256个字符,则使用256个字符的数组来保存每条消息。
使用fwrite将其写入磁盘,使用fread读取,通过将字符串的第一个字符更改为\ 0(或其他任何您喜欢的内容)将其删除并将其写入磁盘。
将消息的索引保存在一个简单的结构(用户名/ recno)中,然后使用fseek在文件中反弹。您可以在编写新记录时强制下一个空闲记录(在文件开头读取并在您按下\ 0时停止)或在数组中保留一个空闲记录索引并在写入时抓住其中一个一个新的(或者如果你的数组是空的,那么fseek到文件的末尾并写一个完整的新记录。)
答案 2 :(得分:0)
我想为完整性提出另一种解决方案:
字符串应以空字节字符"hello world\0"
结尾,因此您可能会读取原始二进制数据,直到达到"\0"
。
其他数据类型有固定位,请注意byteorder(endian)。
此外,您可以在每条消息之前定义有效负载,因此您知道其字符串长度:
"11hello world;2hi;15my name is loco"
因此可以处理数据字段等原始代码段。