参数检查

时间:2011-11-18 13:14:33

标签: c++ file error-handling arguments

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main (int argc, char* argv[])
{
    string STRING;
    ifstream infile;    
    STRING = argv[1];
    infile.open(argv[1]);   
    if (infile.fail())// covers a miss spelling of a fail name
    {
        cout << "ERROR. Did you make a mistake in the Spelling of the File\n";
        return 1;
    }
    else
    {
        while(!infile.eof())
        {
            getline(infile,STRING); // Get the line
            cout<<STRING + "\n"; // Prints out File line
        }   
        infile.close(); 
        return 0; 
    }
}

除了一个问题,我已经让这个程序正常工作

如果用户只运行没有文件名的程序(我认为被称为参数),例如./displayfile,那么我得到一个分段错误

如何修改我的代码,以便程序退出并显示错误消息“添加文件名”

我的第一个想法是

if (!argc=2)
{
    cout << "ERROR. Enter a file name";
    return 1;
}

增加: 以防这个问题正在编译中使用 g ++ displayfile.cpp -o displayfile

3 个答案:

答案 0 :(得分:5)

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main (int argc, char* argv[]) {
   if(argc != 2) {
      cout << "You need to supply one argument to this program.";
      return -1;
   }

   string STRING;
   ifstream infile;    
   STRING = argv[1];
   infile.open(argv[1]);   
   if (infile.fail())// covers a miss spelling of a fail name {
      cout << "ERROR. Did you make a mistake in the Spelling of the File\n";
      return 1;
   }
   else {
      while(!infile.eof()) {
         getline(infile,STRING); // Get the line
         cout<<STRING + "\n"; // Prints out File line
      }   
      infile.close(); 
      return 0; 
   }
}

答案 1 :(得分:2)

除了argc != 2的明显检查之外,我无法帮助修复一些更糟糕的代码和明显的错误:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main (int argc, char* argv[])
{
    if (argc != 2)
    {
        cout << "ERROR. Invalid number of arguments\n";
        return 1;
    }

    ifstream infile(argv[1]);  
    if (!infile)        // covers a miss spelling of a fail name
    {
        cout << "ERROR. Did you make a mistake in the Spelling of the File\n";
        return 1;
    }

    string STRING;
    while(getline(infile, STRING))
        cout << STRING << '\n';      // Prints out file line
    return 0;
}

你不需要调用ifstream::open,只需使用构造函数,同样不需要如此早地声明STRING,也不要将它初始化为文件名,因为你不要使用它。不要忘记,这不是C,你不需要在每个函数的开头都有一大堆声明。

其次,检查流的标志通常是个坏主意,只需检查!infile以查找任何错误。但真正的错误是在while条件中检查infile.eof,因为它只在getline尝试读取文件末尾时才设置,所以你实际上会打印一个(可能是空的)行太多了。只需检查getline的返回值即可找到任何错误或文件结尾。

输出时不要在字符串上添加换行符,只需在字符串后面输出即可。最后但并非最不重要的是,不需要infile.close,因为析构函数无论如何都要调用它。

答案 2 :(得分:0)

STRING = argv[1];更改为if (argv[1] != null) STRING = argv[1];但不确定,因此您必须先测试它。