Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

Аргументы командной строки - C++

19.08.2011, 21:32. Просмотров 2090. Ответов 9
Метки нет (Все метки)

Пытаюсь разобраться с этой штукой. У Дейтела это собственно только дополнение, а не отдельный пункт раздела так что всё написано сжато и с рассчётом на линукс. Собственно программа для копирования файлов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    if(argc!=3)
     cout<<"Usage: copyfile infile_name outfile_name"<<endl;
    else
    {
        ifstream inFile(argv[1],ios::in);
 
        if(!inFile)
        {
            cout<<argv[1]<<" could not be opened"<<endl;
            return -1;
        }
 
        ofstream outFile(argv[2],ios::out);
 
        if(!outFile)
        {
            cout<<argv[2]<<" could not be opened"<<endl;
            inFile.close();
            return -2;
        }
 
        char c=inFile.get();
 
        while(inFile)
        {
            outFile.put(c);
            c=inFile.get();
        }
    }
    return 0;
}
Естественно она рассчитана на запуск из-под винды.
Что я делаю: называю исполняемый файл copyfile.exe, бросаю в корень с. Создаю файл 1.txt и 2.txt и дальше вызвав коммандную строку пишу "copyfile 1.txt 2.txt" . В ответ ничего. Я так понимаю начинает выполняться и циклится чтоли ... Но также мне не нравится то что если я введу просто "copyfile" или "copyfile 1 2 3 4 5" (передам больше чем надо аргументов) то всё равно cmd.exe начнёт выполнять мою copyfile и где-то зациклится. А ведь по идеи если аргументов больше программа должна была бы выдать текстовое сообщение "Usage: copyfile infile_name outfile_name" если я правильно всё понял.
Собственно что я делаю не так и как надо делать под виндой подскажите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2011, 21:32     Аргументы командной строки
Посмотрите здесь:

Аргументы командной строки - C++
int main(int argc,int **argv) Понял только,что argc отвечает за количество аргументов,а argv-массив указателей на строки символов.Но...

Аргументы командной строки - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;fstream&gt; #include &lt;string.h&gt; #include &lt;Windows.h&gt; #include &lt;string&gt; using...

Аргументы командной строки - C++
Необходимо открыть файл на чтение, используя аргументы main. Не хотелось бы прописывать путь к файлу, который хотим открыть. Файл помещен в...

Аргументы командной строки - C++
Здравствуйте, у меня вопрос, почему программа сбрасывается, так и не выполнив никаких действий? Я знаю , что она возвращает 0 и выходит,...

Аргументы командной строки - C++
Есть прога, которая считывает файл посимвольно и выводит количество повторений символов в консоль. Открытие файла происходит так: FILE...

Аргументы командной строки - C++
Уважаемые форумчане, растолкуйте, пожалуйста, назначение третьего аргумента &quot;char *const options&quot; в функции GetOptList . Для чего он данном...

Распечатать аргументы командной строки - C++
Если первый аргумент командной строки - опция -а , то распечатать остальные аргументы без их первых символов , а если первой идет опция -r...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
19.08.2011, 21:48     Аргументы командной строки #2
ну давай разберёмся что это

Цитата Сообщение от Gepar Посмотреть сообщение
if(!outFile)
{
cout<<argv[2]<<" could not be opened"<<endl;
inFile.close();
return -2;
}
значит, вызывается этот оператор в ифе

C++
1
2
3
4
__CLR_OR_THIS_CALL operator void *() const
        {   // test if any stream operation has failed
        return (fail() ? 0 : (void *)this);
        }
а fail проверяет failbit и badbit
C++
1
2
3
4
5
bool __CLR_OR_THIS_CALL fail() const
        {   // test if badbit or failbit is set in stream state
        return (((int)rdstate()
            & ((int)badbit | (int)failbit)) != 0);
        }
а eofbit я тут не вижу, поэтому предполагаю, что условие в ифе не совсем правильное, поэтому и зацикливается?
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
19.08.2011, 21:49     Аргументы командной строки #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <conio.h>
#include <locale.h>
 
int main(int argc, char * argv[])
{
    setlocale(LC_ALL,"");
    if (argc <= 1)
    {
        printf("Ошибка! Не хватает аргументов для работы программы.\n");
        _getch();
        return 0;
    }
 
    else if (argc > 3)
    {
        printf("Ошибка! Слишком много аргументов для работы программы.\n");
        _getch();
        return 1;
    }
 
    else if (argc == 2)
    {
        printf("Ошибка! Выходной файл не указан.\n");
        _getch();
        return 1;
    }
 
    const char *fileNameInput = argv[1];
    const char *fileNameOutput = argv[2];
    FILE *fileInput;
    FILE *fileOutput;
 
    fileInput  = fopen(fileNameInput, "rb");
    fileOutput = fopen(fileNameOutput, "wt+");
 
    if (fileInput == NULL)
    {
        printf("Ошибка открытия входного файла.\n");
        _getch();
        return 1;
    }
 
    else if (fileOutput == NULL)
    {
        printf("Ошибка открытия выходного файла.\n");
        _getch();
        return 1;
    }
 
    int ch;
    while ((ch = fgetc(fileInput)) != EOF)
    {
        fputc(ch, fileOutput);
    }
 
    fclose(fileInput);
    fclose(fileOutput);
 
    fileInput = fileOutput = NULL;
 
    _getch();
    return 0;
}
LosAngeles
Заблокирован
19.08.2011, 21:50     Аргументы командной строки #4
есть вроде функция-член eof(); или как то так пишется её попробуй
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
19.08.2011, 21:53     Аргументы командной строки #5
Следует прописывать полный путь либо сменить текущую директорию в командной строке при помощи команды cd.
А так у меня работает.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
19.08.2011, 22:13  [ТС]     Аргументы командной строки #6
Блиииин, я копировал не тот exe (не из того проекта), а так программа полностью рабочая что я написал, несмотря на то что многие нашли в ней ошибки

LosAngeles, условие while(inFile) какраз и проверяет не достигнут ли конец файла же.

Добавлено через 2 минуты
panicwassano, а зачем у вас столько проверок? Они не оправданы, хотя ... у Вас по выводу можно понять даёшь ты больше аргументов чем надо или меньше . Ну и раз уж создал тему: почему проверяем колличество аргументов на равенство 3м? Передаём ведь два аргумента: что и куда, а аргумент copyfile и так должен быть логичным так как этот аргумент запускает наше приложение, уж по тому что его запустили приложение должно было бы и догадаться что 1 в коммандной строке идёт вызов нашего приложения (copyfile).
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.08.2011, 22:41     Аргументы командной строки #7
Цитата Сообщение от Gepar Посмотреть сообщение
Ну и раз уж создал тему: почему проверяем колличество аргументов на равенство 3м?
1-й аргумент - путь и имя исполняего файла, остальные два
Цитата Сообщение от Gepar Посмотреть сообщение
что и куда,
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
20.08.2011, 03:11  [ТС]     Аргументы командной строки #8
Maxwe11, а, тоесть первый аргумент это ещё и путь. Спасибо, теперь ясно.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.08.2011, 09:55     Аргументы командной строки #9
Цитата Сообщение от Gepar
Я так понимаю начинает выполняться и циклится чтоли
C++
1
2
3
4
5
6
7
char c=inFile.get();
 
        while(inFile)
        {
            outFile.put(c);
            c=inFile.get();
        }
C++
1
2
3
4
    char c;
 
    while(inFile.get(c))
        outFile.put(c);
пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream in("file.txt");
    ofstream out("out.txt");
    char c;
    
    while(in.get(c))
        out.put(c);
    
    return 0;
}


Цитата Сообщение от Gepar
Но также мне не нравится то что если я введу просто "copyfile" или "copyfile 1 2 3 4 5" (передам больше чем надо аргументов) то всё равно cmd.exe начнёт выполнять мою copyfile и где-то зациклится.
должно всё нормально быть
проверь, та ли программа
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2011, 11:06     Аргументы командной строки
Еще ссылки по теме:

Передать аргументы командной строки - C++
как передать 2 аргумента для командной строки Вот я хочу передать имя входного файла и значение типа int вот как я делаю ...

Неясность (аргументы командной строки) - C++
nextArg = 1; while (nextArg &lt; argc) { if ((strlen(argv) &gt; 1) &amp;&amp; ('-' == argv)) ... } Прошу вас...

Аргументы командной строки в функции main - C++
Вопрос собственно говоря банальный в домашнем задании требуеться: параметр пронраммы передаеться через командную строку.Пример: ...

Аргументы N2 командной строки посимвольно не считывается. - C++
Вот, всё предельно просто. Действительно, имеем такую программу #include &lt;stdio.h&gt; int main (int argc, char* argv ) { printf...

Лог файл и аргументы командной строки - C++
Привет! Осваиваю С++ и нужна помощь, я хочу что бы в командной строке: ввел символ и поменялся след робота, но у меня получается так, что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
20.08.2011, 11:06  [ТС]     Аргументы командной строки #10
accept, да уже проблема решена, я писал что копировал не оттудова исполняемый файл, так программа рабочая.
Yandex
Объявления
20.08.2011, 11:06     Аргументы командной строки
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru