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

Аргументы, передаваемые в main - C++

Восстановить пароль Регистрация
 
 
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
13.06.2012, 11:53     Аргументы, передаваемые в main #1
Всем доброго утра. Вот такой вопрос возник.
Запуская программу в консоли имеем вид

C++
1
>cpp1.exe -b -s -f=10 test.txt text_output.rez
cpp1.exe -запуск самой программы
-b -s -f=10 - аргументы
test.txt - исходный файл
text_output.rez - результирующий файл

правильно ли я понимаю, что
C++
1
a=argv[argc-1]
присвоит мне в переменную a, имя результирующего файла?
какого типа должна быть переменная a?
как мне вывести или использовать теперь то, что у меня лежит в этой переменной?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2012, 11:53     Аргументы, передаваемые в main
Посмотрите здесь:

C++ Аргументы функции main
Аргументы функции main C++
C++ аргументы функции main()
Где хранятся аргументы, передаваемые в функцию C++
C++ аргументы main
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.06.2012, 12:05     Аргументы, передаваемые в main #2
Переменная должна иметь тип char *. Но лучше копировать параметр функцией strcpy.
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
13.06.2012, 12:08  [ТС]     Аргументы, передаваемые в main #3
я тут так подумал.. нафиг вообще копировать в переменную

C++
1
    printf(argv[argc-1]);
можно ведь и так делать?

только на -1 дает последний элемент.
а на -2 ошибку
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.06.2012, 12:24     Аргументы, передаваемые в main #4
У printf первый аргумент задает форматную строку, тогда уже так
C++
1
printf("%s\n", argv[argc-1]);
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
13.06.2012, 13:04  [ТС]     Аргументы, передаваемые в main #5
C++
1
    FILE* fopen(argv[argc-2],w+);
в чем ошибка?

Добавлено через 36 секунд
Цитата Сообщение от kazak Посмотреть сообщение
У printf первый аргумент задает форматную строку, тогда уже так
C++
1
printf("%s\n", argv[argc-1]);
не обязательны идентификаторы. можно и без них)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
13.06.2012, 13:09     Аргументы, передаваемые в main #6
Вечный_Студент, Без спецификатора - не корректно.

Добавлено через 42 секунды
Ну и плюс, если уверены, что argc - 2 не будет нулем или меньше тогда так.
C
1
FILE* fopen(argv[argc-2], "w+");
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
13.06.2012, 13:17  [ТС]     Аргументы, передаваемые в main #7
error C2061: syntax error : identifier 'argv'

C++
1
FILE* fopen(argv[argc-2],"w+");
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
13.06.2012, 13:21     Аргументы, передаваемые в main #8
Где у Вас расположена эта запись?
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
13.06.2012, 13:23  [ТС]     Аргументы, передаваемые в main #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
printf("File %s not found!\n",argv[argc-2]);
    printf("sozdat? \ny n");
    switch(getch())
        {
            case 'y': 
                FILE* fopen(argv[argc-2],"w+"); 
                break;
            case 'n': 
                break;
            default:
                printf("error");
                return 0;
        }
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
13.06.2012, 13:26     Аргументы, передаваемые в main #10
Я имел ввиду - это у Вас все находится в main?
Должно быть что то вроде этого:
C++
1
2
3
int main( int argc, char *argv[]) {
   FILE* fopen(argv[argc-2], "w+");
   ....
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
13.06.2012, 13:32  [ТС]     Аргументы, передаваемые в main #11
C++
1
2
3
4
5
6
7
8
9
10
11
void main(int argc, char *argv[]) 
{
    printf("Got %d arguments:\n", argc);
    for(int i = 0; i < argc; ++i)
        puts(argv[i]);
    FILE *in, *out;
    int fclose (FILE *stream);
 
    if ((in=fopen(argv[argc-2],"r"))==NULL)
    {
        printf("File %s not found!\n",argv[argc-2]);
то что выше работает не ругается.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    printf("sozdat? \ny n");
    switch(getch())
        {
            case 'y': 
                FILE* fopen(argv[argc-2],"w+"); 
                break;
            case 'n': 
                break;
            default:
                printf("error");
                return;
        }
 
    }
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.06.2012, 13:59     Аргументы, передаваемые в main #12
Цитата Сообщение от Вечный_Студент Посмотреть сообщение
FILE* fopen(argv[argc-2],"w+");
А ничего, что самой переменной для файла нет?
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
13.06.2012, 14:01  [ТС]     Аргументы, передаваемые в main #13
Цитата Сообщение от kazak Посмотреть сообщение
А ничего, что самой переменной для файла нет?
есть она.

C++
1
>cpp1.exe -b -s -f=10 test.txt text_output.rez
argv[argc-2] == test.txt
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.06.2012, 14:04     Аргументы, передаваемые в main #14
Я имее в виду ту переменную, с помощью которой осуществляется работа с файлом, та самая, которая имеет тип FILE*.
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
13.06.2012, 14:33  [ТС]     Аргументы, передаваемые в main #15
а нет. показалось.
не могу сообразить.

Добавлено через 28 минут
C++
1
FILE* fopen(argv[argc-2],"w+");
здесь что-то еще должно быть?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
13.06.2012, 14:35     Аргументы, передаваемые в main #16
Цитата Сообщение от Вечный_Студент Посмотреть сообщение
FILE* fopen(argv[argc-2],"w+");
ну например так
C++
1
FILE* in = fopen(argv[argc-2],"w+");
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
13.06.2012, 16:58  [ТС]     Аргументы, передаваемые в main #17
C++
1
    FILE* in = fopen(argv[argc-2],"w+");
error C2360: initialization of 'in' is skipped by 'case' label

Добавлено через 1 час 21 минуту
одни ошибки капец

Добавлено через 53 минуты
C++
1
2
3
4
if (argv[i]=='-i')
{
   ....
}
а тут в чем проблема?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2012, 17:03     Аргументы, передаваемые в main #18
Цитата Сообщение от Вечный_Студент Посмотреть сообщение
error C2360: initialization of 'in' is skipped by 'case' label
FILE* in; - перед switch


C++
1
2
case 'y':
    in = fopen(...);
Добавлено через 1 минуту
Цитата Сообщение от Вечный_Студент Посмотреть сообщение
а тут в чем проблема?
C++
1
2
3
4
5
#include <string.h>
...
if (strcmp(argv[i], "-i") == 0)
{
}
Вечный_Студент
 Аватар для Вечный_Студент
2 / 2 / 0
Регистрация: 16.05.2012
Сообщений: 38
13.06.2012, 23:56  [ТС]     Аргументы, передаваемые в main #19
получил вот такой каскад условий

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
int err=1;
printf("Got %d arguments:\n", argc);
for (int i = 0; i < argc-2; ++i)
{
   if (strcmp(argv[i], "-i")==0)
      printf("%s preobrazovat zaglavnie v strothnie\n",argv[i]);
   else
      if (strcmp(argv[i], "-d")==0)
         printf("%s Otsortirovat najdennye stroki po ubyvaniu ih dliny\n",argv[i]);
      else
         if (strcmp(argv[i], "-a")==0)
            printf("%s Otsortirovat najdennye stroki po vosrastaniu ih dliny\n",argv[i]);
         else
            if (strcmp(argv[i], "-c")==0)
           printf("%s Iskat stroki, NE soderzasie zadannu\n",argv[i]);
        else
               if (strcmp(argv[i], "-e=")==0)
              printf("%s Vypolnat dejstvia do stroki nomer M ishodnogo teksta\n",argv[i]);
           else
          if (strcmp(argv[i], "-b=")==0)
             printf("%s Vypolnat dejstvia so stroki nomer N ishodnogo teksta\n",argv[i]);
          else
          if (strcmp(argv[i], "-f=")==0)
             printf("%s Zadaet posledovatelnost simvolov, kotoruu nuzno iskat\n",argv[i]);
          else err=0;                    
}
 
if (err==0)
{
  printf("error");
}


почему считывается только первый "-i"
остальные ошибку дают и выполнение
C++
1
2
3
4
if (err==0)
{
  printf("error");
}
в консоли:
F:\cpp1\Debug>cpp1.exe -i -c -d
Got 4 arguments:
-i preobrazovat zaglavnie v strothnie

error
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2012, 08:24     Аргументы, передаваемые в main
Еще ссылки по теме:

Аргументы для функции main() C++
C++ Шифрование. Аргументы функции MAIN
C++ Аргументы функции main

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

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
14.06.2012, 08:24     Аргументы, передаваемые в main #20
Во первых argv[0] содержит строку с именем исполняемой программы, так как обработки этой строки нигде нету, то на первой же итерации цепочка if'ов будет пройдена до конца, туда где err приравнивается нулю. Выводы делайте сами.

Во вторых
Цитата Сообщение от Вечный_Студент Посмотреть сообщение
for (int i = 0; i < argc-2; ++i)
Подумайте, сколько итераций должно произойти с таким условием.
Yandex
Объявления
14.06.2012, 08:24     Аргументы, передаваемые в main
Ответ Создать тему
Опции темы

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