如何使用文件实现循环缓冲区?

2024-04-13

我的应用程序(C 程序)打开同一文件的两个文件句柄(一个处于写入模式,一个处于读取模式)。应用程序中的两个单独的线程读取和写入文件。这很好用。 由于我的应用程序在 RAM 磁盘大小有限的嵌入式设备上运行,我想写FileHandle在达到最大大小和读取时换行到文件开头FileHandle像循环缓冲区一样跟随。我从答案中了解到这个问题 https://stackoverflow.com/questions/3741888/read-and-write-from-a-file-in-a-circular-buffer-fashion这应该有效。然而一旦我这样做fseek的写FileHandle到文件开头,fread返回错误。会不会EOF重置做事fseek到文件开头?如果是这样,应该使用哪个函数来导致写入文件位置设置为 0,而不导致EOF被重置。

编辑/更新: 我尝试了几件事:


  1. 基于@neodelphi,我使用了管道,这有效。但是我的用例要求我写入文件。我收到多个通道的实时视频监控流,需要将其存储到硬盘上,并读回解码并显示在监视器上。

  2. 感谢 @Clement 关于执行 ftell 的建议,我修复了代码中的几个错误,并为读者包装工作,但是,读取的数据似乎是过时的数据,因为写入仍在缓冲,但读者从硬盘读取过时的内容。出于性能考虑,我无法避免缓冲(我获得需要写入硬盘的 32Mbps 实时数据)。我尝试过仅在从写入换行到读取换行的时间间隔内刷新写入以及在读取换行后截断文件(ftruncate)之类的操作,但这并不能解决陈旧数据问题。

  3. 我正在尝试以乒乓方式使用两个文件来看看这是否可以解决问题,但想知道是否有更好的解决方案


你应该有类似的东西:

// Write
if(ftell(WriteHandle)>BUFFER_MAX) rewind (WriteHandle);
fwrite(WriteHandle,/* ... */);

// Read (assuming binary)
readSize = fread (buffer,1,READ_CHUNK_SIZE,ReadHandle);
if(readSize!=READ_CHUNK_SIZE){
    rewind (ReadHandle);
    if(fread (buffer+readSize,1,READ_CHUNK_SIZE-readSize,ReadHandle)!=READ_CHUNK_SIZE-readSize)
        ;// ERROR !
}

未经测试,但它提供了一个想法。 write 也应该处理这种情况BUFFER_MAX不是模数WRITE_CHUNK_SIZE.

此外,只有在确定数据已被写入时才可以读取。但我想你已经这么做了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用文件实现循环缓冲区? 的相关文章

随机推荐