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