Как сделать ввод данных через командную строку?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Есть программка, которая при запуске просит ввести всего-лишь два параметра: входной и выходной файл.
Как сделать чтобы был вохможен ввод параметров через командную строку типа:
prog.exe in.txt out.txt или что-то вроде этого?

Нашел информацию, что нужно передавать в main фргументы int argc и char** argv, отвечающие за кол-во аргументов и за содержимое аргументов

main.cpp выглядит так:

Код: Выделить всё

#include <iostream>
#include "analyse.h"

int main(int argc, char** argv)
{
    if(3 == argc)
    {
        Analyse temp(argv[1], argv[2]);
        temp.analyse_text();
    }
    else if(1 == argc)
    {
        Analyse temp;
        temp.analyse_text();
    }
    else
    {
        std::cout << "You must enter 2 arguments or nothing.\n";
    }

    return 0;
}
При запуске из консоли:

Код: Выделить всё

prog.exe in.txt out.txt
выдает ошибку об открытии входного файла, хотя файл in.txt находится в одной директории с программой.

===================

В параметрах надо было указывать не только название файлов, но и физический путь к ним.
Отсюда вопрос, можно ли сделать, чтобы переданные параметры в первую очередь искали в папке с программой?
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Убери минусы
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Минусы убрал, забыл поправить пост. Но надо указывать полный путь к файлу, даже если он в директории с exe'шником.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

А файлы как открываешь? Здесь только видно что имена передаются к конструктор Analyse.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Файлы открываю так:

Код: Выделить всё

Analyse::Analyse(const char* the_in_filename, const char* the_out_filename)
            : in_length(strlen(the_in_filename)),
              out_length(strlen(the_out_filename))
    {
        in_filename = new char[in_length + 1]; //'+1' для '\0'
        strcpy(in_filename, the_in_filename);

        out_filename = new char[out_length + 1]; //'+1' для '\0'
        strcpy(out_filename, the_out_filename);

        fin.open(in_filename);
        if(fin.fail())
        {
            cout << "Input file opening failed.\n";
            exit(1);
        }

        fout.open(out_filename);
        if(fout.fail())
        {
            cout << "Output file opening failed.\n";
            exit(1);
        }
  }
fin и fout - переменные-члены класса типа ifstream и ofstream.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

В данном случае, если файлы лежат в каталоге с исполнимым файлом, указывать полный путь не надо. Единственное если запуск производиться из под среды то необходимо указать правильный рабочий каталог.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Откомпилировал прогу. Ложу ее в корень диска С:\ и ложу туда же файл in.txt. Запускаю напрямую - работает. Запускаю из командной строки - "input file opening error". Вот и интересно, может я что-то не так сделал или не дописал в main.cpp (?!).
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

ну так рабочий каталог командная строка задает
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Я понял ошибку. Банальна до ужаса - не надо было тестировать из корня диска С:\ - cmd как ни старался не заставил в корень перейти, по-умолчанию все равно лезет в папку пользователя. Пробовал в любых других местах - все работает.
Т.е. все правильно сделано :)
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

как это нельзя в консоли перейти в корень диска? cd \
Ответить