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

时间:2011-08-25 18:27:47

标签: c file-io embedded

我的应用程序(C程序)打开同一文件的两个文件句柄(一个处于写入状态,另一个处于读取模式)。应用程序中的两个独立线程读取和写入文件。这很好用。 由于我的应用程序在具有有限ram磁盘大小的嵌入式设备上运行,因此我希望在达到最大大小时将FileHandle写入文件的开头,并且像循环缓冲区一样读取FileHandle。我从this question的答案中了解到这应该有效。但是,只要我fseek FileHandle写入文件的开头,fread就会返回错误。将EOF重置为fseek到文件开头?如果是这样,应该使用哪个函数使写入文件位置设置为0而不会导致EOF重置。

EDIT / UPDATE: 我尝试了几件事:


  1. 基于@neodelphi,我使用了管道。但是我的用例需要我写入文件。我收到了多个直播视频监控流通道,需要存储到硬盘中,并且还可以回读解码并在监视器上显示。

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

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

1 个答案:

答案 0 :(得分:1)

你应该有类似的东西:

// 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 !
}

未经测试,但它提供了一个想法。写入也应处理案例BUFFER_MAX不是模WRITE_CHUNK_SIZE

另外,只有在确定数据已经写入时,才可以阅读。但我想你已经这样做了。