2014-10-30 26 views
0

我有一个程序,我需要在一个命令行参数是一个文本文件的名称。该程序由./programName file1运行。如果我的程序的目的,我可以假设文件1将永远是正确的格式,我可以做我在合理安全的假设文件将打开?

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声明的情况?

+1

for good()'返回true,'is_open()'也必须为true。也就是说,你可以用'good()'(或者,我最喜欢的,改成'if(myFile)...',这意味着同样的事情)。 – 2014-10-30 20:03:31

+0

所以只是为了检查,在我的情况,因为我检查!好()我可以做,如果(!myFile)? – 2014-10-30 20:07:58

+2

正确,常见。 – MSalters 2014-10-30 20:21:44

回答

3

您应该主要检查输入的操作,要知道,如果你的文件具有正确的输入格式:

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

要知道在else部分的实际错误的原因,你可以检查由返回的iostate标志std::istream::rdstate()功能。

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

+1

他们应该检查文件是否实际打开。例如。在打开应用程序时可能没有权限访问文件 - 这是一个非常常见的问题。 – 2014-10-30 19:48:23