![](/img/trans.png)
[英]C++ protobuf: how to write multiple messages into file by “SerializeToOstream()”
[英]Not able to write messages into the file in 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();
}
由於將eof
位置1,因此將processName
寫入流失敗。 在寫入之前,請使用sysSettings.clear()
清除流的錯誤狀態標志:
while(!((sysSettings.getline(oneLine,sizeof(oneLine))).eof()))
{
if(!strcmp(oneLine,processName))
return;
}
sysSettings.clear();
sysSettings<<processName;
切勿使用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指出的那樣,一旦您讀取了整個文件,流就處於錯誤狀態,並且不會響應您的寫入,因此請首先清除狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.