LINUX.ORG.RU

перенаправление вывода С++. WTF?

 , , ,


0

1

Доброго времени суток! Решил изучить Unix-way, а в частности, перенаправление ввода-вывода в программах. Решил сделать простейший конвейер, но не понимаю, почему он не работает. Гуглить пробовал, не вышло. В том числе и по ЛОРу. Вот код:

#include <iostream>
using namespace std;
int main(int argv, char** argc)
{
	cout<<argc[1];
	return 0;
}
Пробовал также вот такой:
#include "stdio.h"
using namespace std;
int main(int argv, char** argc)
{
	printf("%s",argc[1]);
	return 0;
}
Проверяю конвейер так:
./prog /usr | ls
То есть, как я понял, такая конструкция мне должна вывести содержимое папки /usr, но выводит только ls текущей директории. ЧЯДНТ?

★★

Дело не в твоем коде. А в том, что ls ждет аргументы, а не ввод со стандартного канала ввода.

Вот так будет работать:

./prog /usr | xargs ls

Команда xargs возьмет данные с твоей проги, сконструирует из них строку аргументов и передаст их ls.

hibou ★★★★★ ()
Ответ на: комментарий от hibou

Спасибо, заработало.

То есть, что cin/cout, что printf/scanf/gets/puts является правильным способом организации потока ввода/вывода?

И если мне вторую прогу надо использовать с несколькими опциями, которые я получаю от других программ, то можно сделать такой конвейер:

prog1 | xargs prog2 | xargs prog3 
При этом внутри prog2 происходит формирование строки опций из выхода prog1 c опциями из prog2 (тупо сплит). Или есть вариант использования xargs (со своими опциями), который вернет строку опций, полученную от двух программ? Например что-то вроде:
prog1 | prog2 | xargs -[options] prog3

aido ★★ ()
Ответ на: комментарий от aido

Для С++ cin/cout предпочтительнее. Насчет xargs, наверное стоит почитать документацию. Суть ты понял вроде бы, что cin - не то же самое, что и argv.

hibou ★★★★★ ()

Это, конечно, непринципиально, но обычно argc и argv называют наоборот.

anonymous ()

Уже сказали. Просто перефразирую. Дело не в коде. Просто ls так не работает.

[br]$ echo "/usr" | ls[br]
тоже не сработает. Как нужно тебе уже сказали.

Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от nanoolinux

можешь нарыть Боурнова вот это:

http://en.wikipedia.org/wiki/The_UNIX_System_(book)

русское издание желательно:

Баурн, Стив. Операционная система UNIX. М.: Мир, 1986

охото зазырить

зы. http://publ.lib.ru/ARCHIVES/M/''Matematicheskoe_obespechenie_EVM''/_''Matemat...

браун отсюда?

qulinxao ★★☆ ()
Ответ на: комментарий от hibou

Про cin я уже давно знал. Не знал и не пробовал делать межпрограммное общение в никсах.

aido ★★ ()
Ответ на: комментарий от nanoolinux

:( Браун для новичков хорош и сам он английский «новичёк»

интересно увидеть брошюрку(желательно в переводе ибо) от создателя sh:

Баурн, Стив. Операционная система UNIX. М.: Мир, 1986

оригинал http://en.wikipedia.org/wiki/The_UNIX_System_(book) от 1983

http://www.amazon.com/Unix-System-International-Computer-Science/dp/0201137917

(хе хе как и у книжки от создателя ObjectiveC про правильное ооп матрёшки на обложке)

qulinxao ★★☆ ()
int main(int argv, char** argc)

Мой эстетизм говорит тебе поменять argv и argc местами, ибо argc расшифровывается как argument count, а argv как argument values.

То есть, как я понял, такая конструкция мне должна вывести содержимое папки /usr, но выводит только ls текущей директории. ЧЯДНТ?

ls не принимает список аргументов через stdin.

nexfwall ★★★★ ()
Ответ на: комментарий от aido

При этом внутри prog2 происходит формирование строки опций из выхода prog1 c опциями из prog2 (тупо сплит). Или есть вариант использования xargs (со своими опциями), который вернет строку опций, полученную от двух программ?

А можешь объяснить по человечески, что ты мелешь?

nexfwall ★★★★ ()
Ответ на: комментарий от nexfwall

есть 2 программы, обе возвращают какие-то числовые или строковые значения. Есть третья прога, которая в опциях получает выходы с этих 2 программ с некоторыми опциями. Вопрос: как это сделать (в смысле передавать выходы с 2 программ на третью) в 1 строчку без создания временных файлов/переменных и прочего? Ясно, что конвейеры надо использовать. На вики, кстати, нашел очень полезную строчку, которая в принципе является решением этого вопроса:

(logname; date; echo $0 $*) | xargs  >>log

aido ★★ ()
Ответ на: комментарий от nexfwall

в том смысле, что все остальное делается по аналогии.

aido ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.