Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Получить аргументы командной строки  (Прочитано 1979 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Heigel

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Здравствуйте. Мне сказали, что моя программа должна запускаться следующим образом:

$ cat input.txt | my_program "input string" > output.txt

Что означает символ "|" ?
Как мне получить в коде программы аргументы командной строки (а именно input.txt, "input string", output.txt)?
Через argc, argv не работает.

Оффлайн gva230

  • Активист
  • *
  • Сообщений: 981
  • GUI-овый Linuxоид
    • Просмотр профиля
    • Моя дикая страничка
Re: Получить аргументы командной строки
« Ответ #1 : 22 Июля 2012, 21:13:17 »
Символ "|" - конвейер. Суть его в том, чтобы передать результат выполнения команды слева команде справа. В Вашем случае результат cat будет обработан командой my_program. Параметр "input string" в данном случае, скорее всего и есть тот самый результат работы команды cat. Результат работы команды my_program выводится в файл output.txt, о чём говорит символ вывода - ">".

Собственно, приведённый код делает следующее: файл input.txt открывается командой cat на чтение, содержимое файла input.txt попадает на обработку команде my_program, результат выполнения которой записывается в файл output.txt.

input.txt и "input string" - исходные данные, output.txt - результат. Эти аргументы получать из командной строки не имеет смысла, так-как вы их туда вносите сами.
Kubuntu - наше фсё! :Ь

Оффлайн Heigel

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Получить аргументы командной строки
« Ответ #2 : 23 Июля 2012, 03:09:50 »
содержимое файла input.txt попадает на обработку команде my_program
как программа получит это содержимое? через какой интерфейс? программа должна быть написана на С.
можно захардкодить имя файла input.txt и каждый раз в main-e его открывать, но если имя файла в командной строке изменится, что тогда?

Эти аргументы получать из командной строки не имеет смысла, так-как вы их туда вносите сами.
вношу в командную строку, а не в программу, для которой это входные данные.

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Re: Получить аргументы командной строки
« Ответ #3 : 23 Июля 2012, 06:14:30 »
...
Через argc, argv не работает.

У всех, главное, работает, а у тебя нет. Может не то ищещь?

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Получить аргументы командной строки
« Ответ #4 : 23 Июля 2012, 07:28:27 »
Heigel
1) Попробуй начать с основ. Изучи систему ввода вывода
У любой программы есть стандартный ввод, стандартный вывод и стандартный вывод для ошибок.
Внутри программы эти стандартные вводы выводы выглядят как обычные файлы. Они уже открыты с самого старта приложения.
Считай что у тебя всегда доступны для работы
FILE *stdin, *stdout, *stderr;
Первый только для чтения вторые два только для записи.

2) изучи возможности конвейерной обработки данных
Стандартный ввод/вывод можно связать
  • с консолью (обычно так и бывает когда ты просто запускаешь программу)
  • с файлом (когда ты например вывод программы отпрвляешь в файл ps ax > process_list.txt здесь результат работы прораммы ps будет записан в файл process_list.txt сама программа не будет знать имени этого файла и что она вообще пишет в файл а не на консоль)
  • с другим процессом (например ps ax | grep compiz здесь вывод программы ps передается другой программе grep и мы получаем примитивнеёший скрипт который все знают. grep не умеет получать список процессов, ps не умеет фильтровать вывод (это не совсем правда но в обучающих целях такое можно допустить) а соединив их вместе мы можем получать информацию только о необходимых нам процессах)
В твоём примере стандартная утилита cat открывает файл input.txt и выплёвывает его содержимое в свой стандартный вывод, её вывод соединён со стандартным вводом твоей программы. тебе не надо знать имя файла. его содержимое будет у тебя доступно из stdin. Когда встретишь конец ввода значит пора завершать работу. Можешь делать с данными что хочешь. Всё что ты напечатешь на стандартный вывод будет записано в файл output.txt тебе опять же не надо знать что да как и как называется этот файл. это всё прихоти пользователя. шел за тебя уже все откроет как надо и подцепит твою программу к этому файлу. просто пиши printf() и данные окажутся там где должны быть.

3) argc argv это параметры командной строки котрые касаются именно твоего приложения. шел распознаёт ввод пользователя и формирует окружение для соответствющих программ. в твоём случае у тебя argc будет равно 2 а argv будет содержать 2 строки 0:"my_program" 1:"input string"

Я без понятия что там тебе надо делать за задание, но удачи. Я не верю что ты успеешь =) невозможно писать на Си и не знать таких базовых вещей.
« Последнее редактирование: 23 Июля 2012, 07:32:41 от Yurror »

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: Получить аргументы командной строки
« Ответ #5 : 23 Июля 2012, 12:00:24 »
как программа получит это содержимое? через какой интерфейс?

Через SYSIN ... моя радость ;)
Ровно через тот интерфейс, который без использования конвейера устанавливается на клавиатуру, файловый дескриптор = 0.

P.S. а вообще, вы задаёте (с претензиями) такие элементарные вопросы, которые нужно ещё из школьного курса информатики представлять.

Оффлайн Heigel

  • Автор темы
  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Re: Получить аргументы командной строки
« Ответ #6 : 24 Июля 2012, 00:12:20 »
спасибо за такое подробное разъяснение. вопрос и правда элементарный, читаем и пишем в файл с помощью scanf и printf, все просто

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.