无法用c ++将消息写入文件?

时间:2013-07-25 12:04:50

标签: c++

您是否看到任何原因,因为哪个processName不会写入sysSettings文件,如果它不存在?我不知道为什么不写那里。请帮忙!!!

void pushSysSet(const char* processName)
    {
        char oneLine[15];
        fstream sysSettings;
        sysSettings.open("p_appmanager/src/sys_settings.txt",ios::in | ios:: out | ios::app);
        if(!sysSettings.is_open())
        {
            if(debugFlag)
            {
                cout<<currentTime()<<"::"<<"Unable to open sys_settings file"<<strerror(errno)<<endl;
                cout.flush();
            }
            return;
        }
        while(!((sysSettings.getline(oneLine,sizeof(oneLine))).eof()))
        {
            if(!strcmp(oneLine,processName))
                return;
        }
        sysSettings<<processName;
        sysSettings.flush();
        sysSettings.close();
    }

2 个答案:

答案 0 :(得分:1)

processName写入流失败,因为eof位已设置。在写入之前用sysSettings.clear()清除流的错误状态标志:

while(!((sysSettings.getline(oneLine,sizeof(oneLine))).eof()))
{
        if(!strcmp(oneLine,processName))
            return;
}
sysSettings.clear();
sysSettings<<processName;

答案 1 :(得分:1)

永远不要使用eof()来控制循环。所有C字符串都是什么?

void pushSysSet(const char* processName)
{
    fstream sysSettings("p_appmanager/src/sys_settings.txt", ios::in | ios::out | ios::app);
    if(!sysSettings)
    {
        if(debugFlag)
        {
            cout<<currentTime()<<"::"<<"Unable to open sys_settings file"<<strerror(errno)<<endl;
            cout.flush();
        }
        return;
    }
    std::string oneLine;
    while(std::getline(sysSettings, oneLine))
    {
        if(oneLine == processName)
            return;
    }
    sysSettings.clear();
    sysSettings << processName << '\n';
}

我清理了一下代码。如果你没有检查结果,没有必要在超出范围之前单独进行冲洗和关闭;无论如何,这都是析构函数的一部分。使用std :: string来消除可能的缓冲区溢出或截断的名称,并且通常可以使事情变得更好。清理了while循环的条件。

我还在processName输出后添加了一个换行符:因为你的阅读代码显然希望这个东西本身就行,所以在写代码中确保这一点是正确的。

最后,正如Casey指出的那样,一旦你读完整个文件,流就处于错误状态,并且不会响应你的写入,所以首先清除状态。