【问题标题】:Error writing to file (fopen) in WinCE7在 WinCE7 中写入文件 (fopen) 时出错
【发布时间】:2016-05-10 10:55:35
【问题描述】:

我正在 WinCE7 中开发一个应用程序。该应用程序包括串行 com 端口和文件 IO 操作。有一个嵌入式设备连接了串口。我需要检查设备上输入的状态并将其详细信息保存在文件中。比方说,如果输入1为高,那么我需要在串口上写Input 1 HIGH,并将其保存在文件中。

现在要在文件中写入数据,我正在使用 fprintffopen 函数。代码如下:

main()
{
  // some code to initialize serial port

  FILE * fp;
  fp= fopen ("Logs.txt", "w+"); //-------> create a file named as Logs.txt
  while(1)
  {
   if(Input1 == TRUE)
   {
     serialPort.Send("Input 1 HIGH");
     fprintf(fp,"%s","Input 1 HIGH"); //-------> saving data in file
   }

   if(Input2 == TRUE)
   {
     serialPort.Send("Input 2 HIGH");
     fprintf(fp,"%s","Input 2 HIGH"); //-------> saving data in file
   }
    //same goes for rest of the inputs
  }
 fclose(fp); //----------> closing the file
}

现在使用fprintf将数据写入文件后,我们需要使用fclose()关闭文件。但是因为我必须持续监控我使用的输入状态,而(1)由于我的控制没有达到fclose(fp)。因此该文件没有关闭,它变得损坏。当我打开文件查看保存的数据时,它给了我以下错误:

如何正确使用flcose()fprintf()将数据写入文件?

【问题讨论】:

    标签: c file windows-ce


    【解决方案1】:

    每次您想要进行日志记录时打开和关闭日志文件并没有错。如果您的 while 循环以非常高的频率执行,它可能会导致问题 - 它可能会减慢您的应用程序。这就是为什么您应该考虑以某种方式关闭您的应用程序的原因,现在据我所知,您在执行应用程序时复制您的日志文件 - 这可能会导致各种问题 - 其中您的文件将被损坏。

    顺便说一句。您还可以使用 windows-ce 原生日志记录 API,例如:CeLog,请参见此处:

    https://msdn.microsoft.com/en-us/library/ee479601.aspx

    https://msdn.microsoft.com/en-us/library/ee488587.aspx

    【讨论】:

      【解决方案2】:

      您的循环何时开始,何时结束?我的意思是,不是程序上的,而是理论上的?最简单的事情似乎是修改while条件。到现在为止,会一直卡在while循环中!

      假设您的程序正在运行,并且只要您的设备保持连接状态,它就会一直运行。因此,您需要监视一些消息或寻找一些表明设备已断开或停止(或任何适当的)的事件。此事件或情况可用作标志(例如,设备连接并处于活动状态时为 TRUE,设备断开连接或不活动时为 FALSE),然后将其用作打开/写入/关闭文件的条件。

      此外,您可以使用计时器或周期性事件来轮询您的设备输入,而不是循环。您可以根据计时器的准确性将轮询率调整到任意高。这将确保您的代码不会陷入循环。比如说,你调用你的函数来监控每个计时器滴答声的输入。所以每次触发滴答事件时,都会读取输入。并且您可以在调用轮询函数之前检查设备的连接情况。

      流程会是这样的:

      Start->设备已连接,标志 TRUE->fOpen->启动计时器
      =>timer tick->flag == TRUE?->poll device->write to file=>(重复每个tick,除非发生以下情况。)

      设备已断开连接,标记为 FALSE
      =>计时器滴答声->标志== TRUE? NO->fClose->停止计时器->停止

      这假设您有某种方法可以检测设备连接/活动与断开/非活动情况。也许设备 SDK 有某种形式的消息或事件来表明这一点。

      【讨论】:

      • 感谢您的解释。目前我正在做的是打开文件以附加文本,然后同时关闭它。所以下次再次打开文件以附加日志。
      • 是的,这也行...顺便说一句,如果你必须写的次数非常多,那么你最终将不得不重复打开和关闭文件,这会影响性能.无论如何,如果一切正常,那就太好了。
      猜你喜欢
      • 2014-06-29
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2018-02-10
      • 2018-07-25
      • 2013-06-28
      相关资源
      最近更新 更多