如何为空字符串大小写添加错误检查

时间:2011-10-14 16:15:30

标签: c++

错误检查缺少文件或输入错误的文件名...但是对于没有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]);
}

3 个答案:

答案 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]中的内容是废话!)怎么办?这就是为什么你应该看看正确的程序选项实用程序......