-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构造函数有一个变体,它接受要打开的文件名,如果流是打开的,析构函数将关闭流,因此可以省略显式调用open()and 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 回答