我的应用程序(C程序)打开同一文件的两个文件句柄(一个处于写入状态,另一个处于读取模式)。应用程序中的两个独立线程读取和写入文件。这很好用。
由于我的应用程序在具有有限ram磁盘大小的嵌入式设备上运行,因此我希望在达到最大大小时将FileHandle
写入文件的开头,并且像循环缓冲区一样读取FileHandle
。我从this question的答案中了解到这应该有效。但是,只要我fseek
FileHandle
写入文件的开头,fread
就会返回错误。将EOF
重置为fseek
到文件开头?如果是这样,应该使用哪个函数使写入文件位置设置为0而不会导致EOF
重置。
EDIT / UPDATE: 我尝试了几件事:
基于@neodelphi,我使用了管道。但是我的用例需要我写入文件。我收到了多个直播视频监控流通道,需要存储到硬盘中,并且还可以回读解码并在监视器上显示。
感谢@Clement关于做ftell的建议我修复了我的代码中的几个错误并为读者包装了工作但是,读取的数据似乎是陈旧的数据,因为写入仍然是缓冲的,但读者从中读取过时的内容硬盘。由于性能方面的考虑,我无法避免缓冲(我需要将32Mbps的实时数据写入硬盘)。我已经尝试过像刷新写入到读取包装和读取包装后截断文件(ftruncate)之间的时间间隔写入,但这并不能解决过时的数据问题。
我正在尝试以乒乓方式使用两个文件来查看是否可以解决问题,但想知道是否有更好的解决方案
答案 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
。
另外,只有在确定数据已经写入时,才可以阅读。但我想你已经这样做了。