-1

いくつかのファイル I/O を含む小さなコードがあります

bool loadConfigFile(std::string configFileName)
{
    std::ifstream configFile;
    try
    {
        configFile.open(configFileName, std::ifstream::in);
        if(true != configFile.good())
        {
            throw std::exception("Problem with config file");
        }
    } catch (std::exception &e)
    {
        fprintf(stderr, "There was an error while opening the file: %s\n %s\n" , configFileName, e.what());
        configFile.close();
    }

    configFile.close();
    return true;
}

また、パラメーターとしてファイルを指定せずにプログラムを起動するたびに、出力にごみ (ランダムな文字) が表示されたり、実行時に予期しないエラーが発生したりします。ここで何が間違っていますか?

4

1 に答える 1

4

"%s"は入力としてnull で終了charする配列を想定していますが、コードは を渡しています。configFileNameこれはstd::string. 使用するstd::string::.c_str()か、std::cerr代わりに使用します。

std::cerr << "There was an error while opening the file: "
          << configFileName << '\n'
          << e.what()       << '\n';

ifstreamコンストラクターには、開くファイル名を受け入れるバリアントがあり、デストラクタはストリームが開いている場合はストリームを閉じるため、 and の明示的な呼び出しをopen()省略close()できることに注意してください。

try
{
    std::ifstream configFile(configFileName);
    if (!configFile.is_open())
    {
        throw std::exception("Failed to open '" + configFileName + "'");
    }
}
catch (const std::exception& e)
{
    // Handle exception.
    std::cerr << e.what() << '\n';
    return false;
}
于 2012-11-19T15:58:12.697 に答える