【问题标题】:Am I reasonably safe in assuming file will open?假设文件会打开,我是否相当安全?
【发布时间】:2014-10-31 04:11:07
【问题描述】:

我有一个程序,我需要在其中接受一个命令行参数,它是一个文本文件的名称。该程序由 ./programName file1 运行。如果出于我的程序的目的,我可以假设 file1 的格式总是正确的,我可以这样做吗

ifstream myFile(argv[1]);
    if(!myFile.good()){
        cout << "Not a valid player file" << endl;
        return 1;   
    }

检查是否有这样的文件,然后简单

myFile >> var1;
myFile >> var2;
myFile.close();

还是我应该坚持

if(myFile.is_open()){
        myFile >> var1;
        myFile >> var2;
        myFile.close();
    }
    else{
        cout << "Unable to open file";
    }

我可以再次假设该文件将始终正确格式化(即 myFile >> var# 将始终有效)。那么在我对(!myFile.good()) 进行初步检查后,是否有可能调用else 语句?

【问题讨论】:

  • good() 要返回 true,is_open() 也必须为 true。也就是说,您可以使用good()(或者,我最喜欢的,更改为if (myFile) ...,这意味着同样的事情)。
  • 所以只是检查一下,在我的情况下,因为我正在检查 !good() 我可以做 if(!myFile)?
  • 正确,常见。

标签: c++ command-line-arguments


【解决方案1】:

您应该主要检查输入操作,以了解您的文件是否具有正确的输入格式:

if(myFile >> var1 >> var2) {
    // Everything's fine
}
else {
   // WRONG FORMAT OR COULDN'T BE OPENED!
}

要了解else 部分中的实际错误原因,您可以检查std::istream::rdstate() 函数返回的iostate 标志。

如果open() 失败,则将设置badbit,如果其中一个输入操作失败,则将设置failbit

【讨论】:

  • 他们应该检查一个文件是否真的被打开了。例如。在打开应用程序时可能没有访问文件的权限——这是一个很常见的问题。
猜你喜欢
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
相关资源
最近更新 更多