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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
19.08.2011, 21:32     Аргументы командной строки #1
Пытаюсь разобраться с этой штукой. У Дейтела это собственно только дополнение, а не отдельный пункт раздела так что всё написано сжато и с рассчётом на линукс. Собственно программа для копирования файлов:

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++
C++ Неясность (аргументы командной строки)
C++ Аргументы командной строки
C++ Аргументы командной строки
Аргументы командной строки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
19.08.2011, 22:13  [ТС]     Аргументы командной строки #6
Блиииин, я копировал не тот exe (не из того проекта), а так программа полностью рабочая что я написал, несмотря на то что многие нашли в ней ошибки

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

Добавлено через 2 минуты
panicwassano, а зачем у вас столько проверок? Они не оправданы, хотя ... у Вас по выводу можно понять даёшь ты больше аргументов чем надо или меньше . Ну и раз уж создал тему: почему проверяем колличество аргументов на равенство 3м? Передаём ведь два аргумента: что и куда, а аргумент copyfile и так должен быть логичным так как этот аргумент запускает наше приложение, уж по тому что его запустили приложение должно было бы и догадаться что 1 в коммандной строке идёт вызов нашего приложения (copyfile).
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.08.2011, 22:41     Аргументы командной строки #7
Цитата Сообщение от Gepar Посмотреть сообщение
Ну и раз уж создал тему: почему проверяем колличество аргументов на равенство 3м?
1-й аргумент - путь и имя исполняего файла, остальные два
Цитата Сообщение от Gepar Посмотреть сообщение
что и куда,
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
20.08.2011, 03:11  [ТС]     Аргументы командной строки #8
Maxwe11, а, тоесть первый аргумент это ещё и путь. Спасибо, теперь ясно.
accept
4838 / 3237 / 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++ Передать аргументы командной строки
C++ Аргументы командной строки
C++ Распечатать аргументы командной строки

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

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

Текущее время: 11:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru