在WinCE7中写入文件(fopen)时出错

时间:2016-05-10 10:55:36

标签: c file windows-ce

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

现在要在文件中写入数据我正在使用fprintf& fopen功能。代码如下所示:

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)。因此,文件未关闭,并且文件已损坏。当我打开文件查看保存的数据时,它给了我以下错误:

enter image description here

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

2 个答案:

答案 0 :(得分:1)

每次打开日志文件并关闭时都没有错误。如果你的while循环以非常高的频率执行,它可能会导致问题 - 它可能会减慢你的应用程序。这就是为什么你应该考虑以某种方式关闭你的应用程序的原因,因为我理解你在执行应用程序时复制你的日志文件 - 这可能会导致所有类型的问题 - 其中包括你的文件将被破坏。

顺便说一句。你也可以使用windows-ce native logging api:CeLog,见这里:

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

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

答案 1 :(得分:0)

你的循环何时开始,何时结束?我的意思是,不是以编程方式,而是从理论上讲?最简单的事情似乎是修改while条件。截至目前,它将无休止地陷入while循环!

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

此外,您可以使用计时器或定期事件来轮询您的设备输入,而不是循环。根据计时器的准确性,您可以根据需要调整轮询率。这将确保您的代码不会陷入循环。比如,你调用你的函数来监视每个计时器滴答的输入。因此,每次tick事件触发时,都会读取输入。您可以在调用轮询功能之前检查设备连接的状况。

流程将类似于:

开始 - >设备已连接,标记为TRUE-> fOpen->启动计时器
=>计时器tick-> flag == TRUE? - > poll device-> write to file => (除非发生以下情况,否则每个刻度都会重复。)

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

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