我正在以顺序方式从文件中读取数据,而同一文件正由另一个进程附加数据。到现在为止还挺好。当我需要从文件中删除我已经检索过的数据时,我的麻烦来了,为了防止文件由于写入过程而变得太大,我必须这样做。我不需要删除我刚刚检索到的数据,但至少要定期删除一些,而不会丢失任何尚未读取的数据。我怎么能用C ++做到这一点?
我知道可能有不同的有价值的方法。我会检查任何对我开发代码有用的任何有效答案。
答案 0 :(得分:3)
这不仅仅是C ++的问题,您使用它的任何语言在某些时候(在其运行时,标准库实现,解释器或其架构)都使用系统为文件处理提供的系统调用(例如open()
,read()
,write()
)。
我不知道任何系统调用会删除文件的某些部分或用其他东西替换部分(你可以将自己定位在文件中间某处并开始覆盖其内容,但这将是一个字节字节更改,你不能用另一个不同大小的部分更改它的一部分)。有各种各样的解决方法可用于模拟删除或更改文件的某些部分,但没有任何可以直接执行的操作。例如:从原始文件中读取,只写入要保存在临时文件中的内容,删除原始文件并重命名临时文件。但是如果写入过程使文件保持打开状态,这将不适用于您的情况。
另一种方法是受到logrotate的启发:当文件达到某个最大大小时,它会被一个新的大小切换,你可以根据需要处理前一个。这种方法确实需要改变写作过程。
答案 1 :(得分:1)
您可以在开头指定文件长度,然后开始在其中写入,当您到达文件末尾时,您只需再次开始在文件的开头写入。但是你应该确保读指针没有通过写指针。
答案 2 :(得分:0)
您似乎正在尝试使用常规文件模拟named pipe的行为。这将需要您的操作系统的特殊支持,这可能不存在,因为您应该使用命名管道。命名管道是一种特殊的文件,用于两个进程之间的通信。与常规文件一样,它有一个路径,有一个文件名并存在于磁盘上。但是,如果常规文件的内容存储在磁盘上,则命名管道的内容仅存在于内存中,而只存在于已写入但尚未读取的数据中。这正是你想要做的。
假设您使用的是基于unix的操作系统。您可以运行mkfifo outputfile
,然后使用outputfile
进行阅读和追加。不需要C ++代码,但如果您需要,也可以从c ++代码中调用mkfifo()
。
如果你使用的是Windows,那一切都会变得有点复杂。您必须指定\\.\pipe\outputfile
之类的内容作为读取和追加的文件名。