错误检查缺少文件或输入错误的文件名...但是对于没有file_name,即字符串file_name为空我得到错误
抛出terminate
的实例后调用
'std::logic_error'
然后Windows也向我抛出错误。
我的猜测是在创建ifstream类型的实例之前添加对空字符串的检查...在file_name.str()...但只是想检查。
void file_to_string(string file_name)
{
string line;
ifstream myfile(file_name.c_str());
if (myfile.is_open())
{
while (myfile.good())
{
getline(myfile, line);
cout << line;
}
myfile.close();
}
else
{
cout << "File : " << file_name << " : did not open";
}
}
int main(int argc, char* argv[])
{
file_to_string(argv[1]);
}
答案 0 :(得分:1)
编辑:哎哟 - 需要更多咖啡。如清楚所述,这是一个字符串对象而不是指针。因此,使用字符串提供的成员来验证它是否包含内容。实际上,在文件的顶部,使用string.empty ala:
if (file_name.empty())
{
// bug out
cout << "Invalid filename" ;
return;
}
EDIT2:正如Nim正确指出的那样,这不是防弹的,因为可能没有提供参数(因此你对argv [1]的引用会陨石坑)。因此,请在main()或其他函数中检查这些情况以验证参数。
您可以执行以下操作:
if (argc < 2)
{
// complain about lack of proper arguments
}
else
{
file_to_string(argv[1]);
}
所有这一切,在一个稍微复杂的案例中,您可能需要添加多个不同的命令行参数,或者以任意顺序提供参数(因此您不能依赖于'1'就像你在这里)。
正确处理所有这些可能会很快变得相当复杂,所以看看其他人已经实现的方法来处理这个问题(以及更多 - 如果您的选项来自配置文件而不是命令行会怎样?)。其中一个选择是Boost对计划选项的支持;见http://www.boost.org/doc/libs/1%5F39%5F0/doc/html/program%5Foptions.html
答案 1 :(得分:1)
如果您根本不提供参数,则argv
将只包含一个字符串,argv[1]
将无效。在您尝试访问它之前,您必须检查它:
int main(int argc, char* argv[])
{
if (argc != 2) {
std::cerr << "Usage: " << argv[0] << " filename\n";
return EXIT_FAILURE;
}
file_to_string(argv[1]);
}
没有特别需要检查字符串是否为空;如果是,那么该文件将无法打开,就像对任何其他无效文件名一样,并且您的代码已经处理过。
答案 2 :(得分:0)
错误发生的时间高于那个 - 如果没有提供参数(即argv[1]
中的内容是废话!)怎么办?这就是为什么你应该看看正确的程序选项实用程序......