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 に答える