Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个应用程序如何在另一个应用程序编写文本文件时使用(删除)文本文件中的行? 我有两个C++应用程序在Windows上运行的情况。一种是将行写入文件,另一种是删除行-有效地将文件用作生产者/消费者模式 概念 制作人 消费者_C++_Windows_File Io - Fatal编程技术网

一个应用程序如何在另一个应用程序编写文本文件时使用(删除)文本文件中的行? 我有两个C++应用程序在Windows上运行的情况。一种是将行写入文件,另一种是删除行-有效地将文件用作生产者/消费者模式 概念 制作人 消费者

一个应用程序如何在另一个应用程序编写文本文件时使用(删除)文本文件中的行? 我有两个C++应用程序在Windows上运行的情况。一种是将行写入文件,另一种是删除行-有效地将文件用作生产者/消费者模式 概念 制作人 消费者,c++,windows,file-io,C++,Windows,File Io,这只是概念性的,因为我相当确信在Windows上,C/C++不允许您从这样的文件开头删除,即removeLineFromFile()实际上是不可能的 那么,我如何才能实现我的目标,让制作人能够在不知道消费者在做什么的情况下继续写入文件呢?在一个完美的世界里,制作人甚至不会意识到消费者的存在,但我不确定是否有任何文件写入模式允许这样做 到目前为止,我的想法是消费者反复复制文件并删除原始文件,因此制作人一直在重新创建文件。换言之: 可能的设计(?) 制作人(不变) 消费者(修改) 这是可行/合理的方

这只是概念性的,因为我相当确信在Windows上,C/C++不允许您从这样的文件开头删除,即
removeLineFromFile()
实际上是不可能的

那么,我如何才能实现我的目标,让制作人能够在不知道消费者在做什么的情况下继续写入文件呢?在一个完美的世界里,制作人甚至不会意识到消费者的存在,但我不确定是否有任何文件写入模式允许这样做

到目前为止,我的想法是消费者反复复制文件并删除原始文件,因此制作人一直在重新创建文件。换言之:

可能的设计(?) 制作人(不变) 消费者(修改)
这是可行/合理的方法吗?如果是这样的话,我该如何做才能使制作者在其写入的文件不断被删除的同时继续工作?如果没有,我该如何实现目标,即避免任何生产者必须倾听消费者意见的IPC?这是一个设计限制,消费者不能打电话进来,也不能与制作人互动——它只能在某种意义上倾听。

简短回答:不要这样做。使用为进程内通信设计的机制。其基础是文件是流设备。您不能删除文件中的内容,但可以覆盖内容。删除的常用方法是将旧文件内容写入新文件,但要删除的内容除外。必须使用文件吗?您可以改用管道吗?看起来您正在使用单个文件实现双缓冲。我建议一个线程写入一个文件,直到完成,然后开始第二个文件。“读取”线程随后将开始处理第一个文件(并且可以在到达末尾时删除该文件)。我的建议是每个文件一个线程。你真的不希望线程在一个文件上发生冲突,会很快变得丑陋。
fp = openFile(path,writeFlags);
while(!stop)
{
 writeLineToFileAndFlush(fp,getNextLine());
}
fp = openFile(path, readWriteFlags);
while(!(stop || eof))
{
 txt = removeLineFromFile(fp); //read and delete the line
 process(txt);
}
fp = openFile(path,writeFlags);
while(!stop)
{
 writeLineToFileAndFlush(getNextLine());
}
while(!stop)
{
 copyFile(path,tempPath);
 eraseFile(path); //needs to not stop Producer writing to the now-empty file
 fp = openFile(tempPath, readWriteFlags);
 while(!eof)
 {
   txt = readLineFromFile(fp);
   process(txt);
 }
 deleteFile(tempPath);
}