1

您是否看到任何原因,因为 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();
    }
4

2 回答 2

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输出后添加了一个换行符:由于您的阅读代码显然希望该事物本身位于一行,因此只有在编写代码中确保这一点才是正确的。

最后,正如凯西指出的那样,一旦您读取了整个文件,流就处于错误状态并且不会响应您的写入,因此请先清除状态。

于 2013-07-25T12:19:47.687 回答
1

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

while(!((sysSettings.getline(oneLine,sizeof(oneLine))).eof()))
{
        if(!strcmp(oneLine,processName))
            return;
}
sysSettings.clear();
sysSettings<<processName;
于 2013-07-25T12:17:23.190 回答