您是否看到任何原因,因为哪个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();
}
答案 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指出的那样,一旦你读完整个文件,流就处于错误状态,并且不会响应你的写入,所以首先清除状态。