LINUX.ORG.RU

c++ передать данные в программу

 ,


0

1

Доброго времени суток! По заданию мне необходимо передавать данные в мою программу таким образом:

ls -l | ./myproga.out
Пытаюсь вывести то, что получил из ls но код
for (int i = 0; i < argc; i++) cout << "argv[" << i << "] содержит " << argv[i] << endl; 
Выдает только имя программы, тогда как переданные ей данные не выводятся. Что я не так делаю, подскажите пожалуйста. Заранее спасибо.


Переданные твоей программе данные в таком случае надо читать из стандартного ввода.

yoghurt ★★★★★
()

Если же ты хочешь передавать что-то именно как аргументы, используй xargs

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

Переданные твоей программе данные в таком случае надо читать из стандартного ввода.

Прошу прощения, а можно пнуть куда копать? Там вроде еще в задании что-то про конвеер было. Это из той же оперы?

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

Прошу прощения, а можно пнуть куда копать?

Ты уже используешь cout. Теперь тебе надо заюзать cin.

Конвейер тут при том, что (гипотетически) ls использует cout для вывода. Т.е. её cout соединён с твоим cin - вот тебе и конвейер.

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

Теперь тебе надо заюзать cin.

Пардон за мое ламерство, но я умею юзать cin только в конструкциях типа cin >> varname; А как мне загнать туда информацию из вывода другого приложения?

gwyllum
() автор топика
Ответ на: комментарий от ziemin

Я не прикалываюсь, я суть не могу уловить. cin - считывает из клавиатуры, cout выводит на экран. Как мне перехватить данные в выводе другого приложения я не понимаю

gwyllum
() автор топика

Не плюсы, да не суть, берём 10 строк из стандартного потока и выводим их

#include <stdio.h>
#include <string.h>

int main(void)
{
    #define MAXBUFF 10000
    char buff[MAXBUFF];

    for(int i=10;i>0;i--)
    {
        fgets(buff,MAXBUFF,stdin);
        printf("%s",buff);
        
    };

	return 0;
}

dron@gnu:~$ ls / | ./a.out 
bin
boot
dev
etc
home
initrd.img
initrd.img.old
lib
lib32
lib64
dron@gnu:~$ 
Dron ★★★★★
()
Последнее исправление: Dron (всего исправлений: 2)
Ответ на: комментарий от gwyllum

cin - считывает из клавиатуры, cout выводит на экран.

Это частные случаи. На самом деле это общие (и стандартные) потоки в/в.

Что на другом конце зависит от контекста запуска. Может вообще ничего не быть: < /dev/null ./myprog.out > /dev/null

А ещё то, что они стандартные означает, что они есть у всех приложений. Соответственно ты можешь соединить любые приложения в конвейер.

ziemin ★★
()

argv,argc для того что бы передавать аргументы в функцию main из вне, это не потоки ввода/вывода. Для образования конвейеров нужны stdout и stdin.

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

Тебе не син соут нужен, а про дескрипторы файлов почитать. В особенности дескрипторы номер 0,1 и 2.

nanoolinux ★★★★
()

Ты берёшь данные из параметров запуска, а надо из стандартного ввода (cin).

Примерно так:

#include <iostream>

using namespace std;

int main() {
        string s;
        while(getline(cin,s)) cout<<s;
        return 0;
}

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Спасибо большое! То, что нужно.

Всем огромное спасибо за потраченое время. Разобрался

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