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

问题描述 投票:0回答:2

我的应用程序(C 程序)打开同一文件的两个文件句柄(一个处于写入模式,一个处于读取模式)。应用程序中的两个单独的线程读取和写入文件。这很好用。 由于我的应用程序在 RAM 磁盘大小有限的嵌入式设备上运行,因此我希望在达到最大大小时写入

FileHandle
来换行到文件开头,并且读取
FileHandle
像循环缓冲区一样跟随。我从这个问题的答案中了解到这应该有效。但是,一旦我将
fseek
写入文件开头,
FileHandle
就会返回错误。在执行
fread
到文件开头时,
EOF
会重置吗?如果是这样,应该使用哪个函数将写入文件位置设置为 0,而不导致
fseek
重置。

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


    基于@neodelphi,我使用了管道,这有效。但是我的用例要求我写入文件。我收到多路实时视频监控流,需要存储到硬盘并读回解码并显示在监视器上。
  1. 感谢@Clement关于执行ftell的建议,我修复了代码中的几个错误,并且为读者包装工作,但是,读取的数据似乎是陈旧的数据,因为写入仍在缓冲,但读者从硬盘读取陈旧的内容。出于性能考虑,我无法避免缓冲(我获得需要写入硬盘的 32Mbps 实时数据)。我尝试过仅在从写入换行到读取换行的时间间隔内刷新写入以及在读取换行后截断文件(ftruncate)之类的操作,但这并不能解决陈旧数据问题。
  2. 我正在尝试以乒乓方式使用两个文件来看看这是否可以解决问题,但想知道是否有更好的解决方案
c file-io embedded
2个回答
0
投票

EOF

未经测试,但它提供了一个想法。写入还应该处理 
// 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
的情况。

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


0
投票

WRITE_CHUNK_SIZE

根据具体情况,权限也可能更严格。

© www.soinside.com 2019 - 2024. All rights reserved.