#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
не следует ожидать никакого вывода