在执行文件I / O时出现异常的意外结果

时间:2012-11-19 15:55:13

标签: c++ file exception file-io exception-handling

我有一些带有一些文件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;
}

每次我启动程序而没有提供作为参数的文件时,我会在输出(随机字符)上遇到一些垃圾或者在运行时出现意外错误。我在这里做错了什么?

1 个答案:

答案 0 :(得分:4)

"%s"期望以空终止的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构造函数有一个变量,它接受要打开的文件名,如果流已打开,析构函数将关闭该流,因此对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;
}