Проверка аргументов - PullRequest
       24

Проверка аргументов

2 голосов
/ 18 ноября 2011
#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 ]

5 голосов
/ 18 ноября 2011
#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; 
   }
}
2 голосов
/ 19 ноября 2011

Помимо очевидной проверки для 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, чтобы найти какие-либо ошибки. Но настоящая ошибка заключается в проверке infile.eof в условии while, поскольку он устанавливается только после того, как getline попытается прочитать конец файла, так что вы фактически напечатаете одну (возможно, пустую) строку слишком много. Просто проверьте возвращаемое значение getline, чтобы найти ошибки или конец файла.

И не добавляйте символ новой строки в строку при выводе, просто поместите ее после строки. И последнее по порядку, но не по значению: нет необходимости в infile.close, поскольку деструктор все равно его вызывает.

0 голосов
/ 18 ноября 2011

измените STRING = argv[1]; на if (argv[1] != null) STRING = argv[1];, но я не уверен, поэтому сначала вам нужно его проверить.

...