我正在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)
。因此,文件未关闭,并且文件已损坏。当我打开文件查看保存的数据时,它给了我以下错误:
如何正确使用flcose()
和fprintf()
在文件中写入数据?
答案 0 :(得分:1)
每次打开日志文件并关闭时都没有错误。如果你的while循环以非常高的频率执行,它可能会导致问题 - 它可能会减慢你的应用程序。这就是为什么你应该考虑以某种方式关闭你的应用程序的原因,因为我理解你在执行应用程序时复制你的日志文件 - 这可能会导致所有类型的问题 - 其中包括你的文件将被破坏。
顺便说一句。你也可以使用windows-ce native logging api:CeLog,见这里:
答案 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具有某种形式的消息或事件来表示这一点。