Запуск программы из командной строки и использование argv в C

#c #command-line

#c #командная строка

Вопрос:

Я написал программу, которая принимает имя файла из argv[1] и выполняет операции над ним. При отладке из Visual Studio я передаю имя файла из project options>> debugging>> command arguments, и он работает нормально и выводит все результаты правильно.

Но при попытке из командной строки я захожу в каталог project / debug и набираю

 program
  

Он работает нормально и выводит «Нет допустимого входного файла» в том же окне (это мой метод обработки ошибок)

но когда я набираю

 program test.txt
  

Это просто ничего не делает. Я думаю, что в коде проблем нет, потому что он отлично работает из отладчика.

Код :

 int main(int argc, char *argv[]) 
 { 
int nLines;
string str;

if(argv[1]==NULL)
{
    std::cout << "Not valid input file" << endl;
    return 0 ;

}
ifstream infile(argv[1]);

getline(infile,str);
nLines = atoi(str.c_str());//get number of lines

for(int line=0 ;line < nLines;line  )
{
    //int currTime , and a lot of variables ..
            //do a lot of stuff and while loops
          cout << currTime <<endl ;

}
    return 0 ;
    }
  

Комментарии:

1. Здесь недостаточно того, что нужно учитывать. Очевидно, что есть проблема с кодом, иначе это сработало бы, верно?

2. Я опубликовал код, хотя отладчик Visual Studio печатает результаты нормально.

3. Я нахожусь внутри нужного каталога, он напечатал «Нет допустимого входного файла»

4. if(argv[1]==NULL) следует заменить на if (argc != 2) , добавляйте if/while (infile) перед каждой операцией ввода-вывода.

Ответ №1:

Вы не проверяете, был ли файл успешно открыт, вернул ли getline код ошибки или нет, или преобразование строки в целое число не завершилось ошибкой. Если возникнет какая-либо из этих ошибок, что, я предполагаю, имеет место, nLines будет равно 0 , циклы выполняться не будут, и программа завершит работу с кодом возврата 0 .

Комментарии:

1. Ну, я обнаружил ошибку, которая заключалась в том, что тестовый файл в каталоге проекта не соответствовал текущему каталогу, поэтому он работал для отладчика. Итак, ваш ответ наиболее полезен. Мне нужно было проверить, успешно ли открылся файл или нет.

Ответ №2:

У меня этот код работал корректно при запуске из командной строки.

 #include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) 
{ 
    int nLines;
    string str;

    if(argv[1]==NULL)
    {
        std::cout << "Not valid input file" << endl;
        return 0 ;

    }
    else
        std::cout << "Input file = " << argv[1] << endl;
}
  

Вывод :

 C:Usersjohn.diblingDocumentsVisual Studio 2008Projectshacks_vc9x64Debug>hacks_vc9.exe hello
Input file = hello
  

Кстати, этот код в лучшем случае опасен:

 if(argv[1]==NULL)
  

Вероятно, вам следует проверить значение argc , прежде чем пытаться разыменовать указатель, возможно, являющийся произвольным.

Комментарии:

1. Спасибо за это замечание об argv.

Ответ №3:

Вероятно, файл содержит недопустимую числовую первую строку (возможно, начинающуюся с пробела или спецификации).

Это объяснило бы отсутствие вывода, поскольку, если nLines == 0 не следует ожидать никакого вывода