我有一个奇怪的问题,我想我有一个解决方法,但我试图做一个根本原因分析。fopen vs流
我一直在开发一个在Ubuntu 10.04 LTS的嵌入式版本上运行的应用程序。当应用程序启动时,它从SD卡读取一个配置文件,初始化几个类,启动一个写入SD卡的记录器,然后继续它的操作。在开发过程中,当我通过SSH终端手动启动时,它运行良好。
我最近一直在尝试让应用程序在操作系统启动时自动启动。我在init.d中有一个脚本,就是这么做的。但是,我注意到现在没有生成日志文件。我发现这不是SD卡不可用的问题,因为配置文件在启动时被正确读取,但是当我尝试打开日志文件以使用fopen进行写入时会引发错误。
// Open the file
mLogFile = fopen(filename, "wb");
if(mLogFile == NULL)
{
printf("Error opening Log File [%d].\n", lnRetval);
return -1; //File couldn't be opened
}
我认为这只是一个权限问题,但我不明白为什么它时,我自动启动软件还是在终端手动运行它不工作。此外,我不明白为什么配置文件正确读取,但无法打开此文件。
我可以看到的唯一区别是配置文件读取使用fstreams完成,而记录器使用C文件I/O。所以我试着在上面的fopen调用之前直接放置下面的代码(/ home/root/etc是安装SD卡的地方)。
std::ofstream out("/home/root/etc/log/testlog.log");
out << "I can write using fstreams.\n";
out.close();
这是通过init.d启动时工作和生成的文件。现在我完全难倒了。为什么流媒体工作而不是打开?有什么根本上我失踪了?
在此先感谢。
你说没有生成日志文件,并尝试用fopen打开日志文件时出现错误。你确定用fopen打开一个有效的日志文件吗? ..对不起,如果我错过了什么。 – Wasi
在您的流测试中,您为测试日志指定了硬编码路径。在fopen()调用中使用的'filename'是否也具有指定的完整路径?确保手动启动和init.d启动之间的相对路径不相同。 –
这个问题应该阅读**为什么'fopen'在通过'std :: ofstream'使用时工作,但是直接使用**时不行。因为'std :: ofstream'里面只用了'fopen'。 –