Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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++,它将消息发送到App B。 严格的要求是B永远不会收到副本。 应用程序A从文件中读取消息,每条消息1行,并将上次读取消息的行号保留在一个变量中,例如lineNo。 假设应用程序a的其他部分中有一个bug,导致整个应用程序a崩溃。 重新启动时,应用程序A不应从开始读取文件,而是从lineNo开始读取文件。它应该从某处得到那条线。 所以,问题是-我如何以安全的方式保持A的值? 我的第一个想法是将其写入一个文件,但由于我至少不知道如何覆盖文件的一部分-我想我必须在覆盖模式下引用open file-write value-close file来覆盖我遇到的每一行,这对于操作系统处理程序来说不是一件好事。 你能想到其他的选择吗_C++_File_Crash - Fatal编程技术网

如何在文件中保持变量的最新值? 假设我有一个应用程序C++,它将消息发送到App B。 严格的要求是B永远不会收到副本。 应用程序A从文件中读取消息,每条消息1行,并将上次读取消息的行号保留在一个变量中,例如lineNo。 假设应用程序a的其他部分中有一个bug,导致整个应用程序a崩溃。 重新启动时,应用程序A不应从开始读取文件,而是从lineNo开始读取文件。它应该从某处得到那条线。 所以,问题是-我如何以安全的方式保持A的值? 我的第一个想法是将其写入一个文件,但由于我至少不知道如何覆盖文件的一部分-我想我必须在覆盖模式下引用open file-write value-close file来覆盖我遇到的每一行,这对于操作系统处理程序来说不是一件好事。 你能想到其他的选择吗

如何在文件中保持变量的最新值? 假设我有一个应用程序C++,它将消息发送到App B。 严格的要求是B永远不会收到副本。 应用程序A从文件中读取消息,每条消息1行,并将上次读取消息的行号保留在一个变量中,例如lineNo。 假设应用程序a的其他部分中有一个bug,导致整个应用程序a崩溃。 重新启动时,应用程序A不应从开始读取文件,而是从lineNo开始读取文件。它应该从某处得到那条线。 所以,问题是-我如何以安全的方式保持A的值? 我的第一个想法是将其写入一个文件,但由于我至少不知道如何覆盖文件的一部分-我想我必须在覆盖模式下引用open file-write value-close file来覆盖我遇到的每一行,这对于操作系统处理程序来说不是一件好事。 你能想到其他的选择吗,c++,file,crash,C++,File,Crash,另外,我所说的其他部分的bug是——它是由其他开发人员开发的,我无法控制。或者,例如,直流电源断电。或者是一颗陨石撞上了它= 实际上,我不仅仅局限于变量的文件保存。几乎所有你能发明的技术-sqlite,内存映射文件-无论什么。。。但我认为sqlite甚至比文件访问更慢。内存映射文件很有趣,我将测试它,谢谢= 以覆盖模式打开文件-写入值-关闭文件 没有其他文件打开模式。您可以附加到文件,但这只不过是在打开时将写指针设置为文件的结尾 然而,对于这样的存储,面向行的文件是错误的格式——必须严格地保持在

另外,我所说的其他部分的bug是——它是由其他开发人员开发的,我无法控制。或者,例如,直流电源断电。或者是一颗陨石撞上了它= 实际上,我不仅仅局限于变量的文件保存。几乎所有你能发明的技术-sqlite,内存映射文件-无论什么。。。但我认为sqlite甚至比文件访问更慢。内存映射文件很有趣,我将测试它,谢谢=

以覆盖模式打开文件-写入值-关闭文件

没有其他文件打开模式。您可以附加到文件,但这只不过是在打开时将写指针设置为文件的结尾

然而,对于这样的存储,面向行的文件是错误的格式——必须严格地保持在相同的字节位置

此外,这里还有两件事:

B需要保证永远不会收到副本。最简单也是最明显的解决方案:A永远不应该通过崩溃发送副本!我可能认为你不是最有经验的程序员,所以这里有一件事:如果你有这样的需求,你将需要防故障a。调试它。为什么会崩溃? 听起来您应该在A和B之间进行适当的双向IPC进程间通信。只有A有办法询问B它期望的下一个值是什么,这才是正常的。 根据您的操作系统的不同,有一个类似文件的对象,它类似于管道,在读取字节后,字节立即消失:FIFO。这在用户崩溃的Unixoid上不起作用,但是,嘿,这是一个开始。 有很多IPC框架可以构建稳定的管道,所以你想要的解决方案可能是文件读取器->IPC管道->a->B?看看ZeroMQ的REQ/REP套接字。
就操作系统处理程序而言,我认为您的文件解决方案没有问题。但是,崩溃的原因也可能影响文件写入,例如写入错误的数据等。。。只是UB。。正确的解决方案是修复导致崩溃的bug,而不是别的。没有解决办法……如果非常关键,没有两次发送消息,那么操作系统崩溃、断电等情况如何?=>重新设计。假设在应用程序a的其他部分有一个bug,导致整个应用程序a崩溃。解决方案:找到bug并修复它。严肃地说:任何使变量lineNo持久化的机制都可能引入新的bug。它很难帮助你,除非你更具体,并显示一些代码,你是问一个内存映射文件。你真正需要的是什么还很不清楚。你的要求是有缺陷的,因为理论上的原因。邮件可能在传输过程中丢失。您不知道您发送的最后一条消息是否已到达。即使是确认消息也不能很好地解决这个问题,因为它也可能丢失,然后您会意外地重新发送最后一条消息。一个健壮的协议必须对双方都有弹性。现实一点:崩溃是统计上的必然。即使在冗余硬件上,误码率也在1E-15-1E-18之间。罕见,非常罕见,但即使在可证明正确的程序中也一定会发生@MSalters:这正是我提出安全文件读取器/IPC编写器的原因。