0

こんにちは皆さん、このコードを使用して含まれている行を見つけます seta r_fullscreen "0"。この行の値が 0 の場合は MessageBox を返しますが、値seta r_fullscreenが「0」の場合、この行でこの値を「1」に置き換えるにはどうすればよいですか?

ifstream cfgm2("players\\config_m2.cfg",ios::in);
string cfgLine; 
    Process32First(proc_Snap , &pe32);
    do{     
        while (getline(cfgm2,cfgLine)) {
        if (string::npos != cfgLine.find("seta r_fullscreen")){
        if (cfgLine.at(19) == '0'){

        MessageBox(NULL,"run in full Screen mod.","ERROR", MB_OK | MB_ICONERROR);

        ...
4

1 に答える 1

1

とを使用してこれを行うことができstd::string::find()ますstd::string::replace()。構成指定子を含む行を見つけseta r_fullscreenたら、次のようなことができます。

std::string::size_type pos = cfgLine.find("\"0\"");
if(pos != std::string::npos)
{
    cfgLine.replace(pos, 3, "\"1\"");
}

と の間に"0"追加のスペースがある可能性があるため、構成値が特定のオフセットにあると想定しないでください。r_fullscreen"0"

追加のコメントを確認したら、変更が行われた後に構成ファイルを更新する必要があります。文字列に加えた変更は、メモリ内のコピーにのみ適用され、ファイルには自動的に保存されません。ロードして変更した後に各行を保存し、更新内容をファイルに保存する必要があります。また、構成ファイルを更新するプロセスをdo/whileループの外に移動する必要があります。そうでない場合は、チェックするプロセスごとにファイルを読み取り/更新します。

以下の例から始めることができます。

#include <fstream>
#include <string>
#include <vector>


std::ifstream cfgm2("players\\config_m2.cfg", std::ios::in);
if(cfgm2.is_open())
{
    std::string cfgLine; 
    bool changed = false;
    std::vector<std::string> cfgContents;
    while (std::getline(cfgm2,cfgLine))
    {
        // Check if this is a line that can be changed
        if (std::string::npos != cfgLine.find("seta r_fullscreen"))
        {
            // Find the value we want to change
            std::string::size_type pos = cfgLine.find("\"0\"");
            if(pos != std::string::npos)
            {
                // We found it, not let's change it and set a flag indicating the
                // configuration needs to be saved back out.
                cfgLine.replace(pos, 3, "\"1\"");
                changed = true;
            }
        }
        // Save the line for later.
        cfgContents.push_back(cfgLine);
    }

    cfgm2.close();

    if(changed == true)
    {
        // In the real world this would be saved to a temporary and the
        // original replaced once saving has successfully completed. That
        // step is omitted for simplicity of example.
        std::ofstream outCfg("players\\config_m2.cfg", std::ios::out);
        if(outCfg.is_open())
        {
            // iterate through every line we have saved in the vector and save it
            for(auto it = cfgContents.begin();
                it != cfgContents.end();
                ++it)
            {
                outCfg << *it << std::endl;
            }
        }
    }
}

// Rest of your code
Process32First(proc_Snap , &pe32);
do {
    // some loop doing something I don't even want to know about
} while ( /*...*/ );
于 2013-06-24T19:36:49.177 に答える