Cześć!
Piszę pod linuxa odpowiednik programu less z wykorzystaniem ncurses i mam problem z obsługą przekierowań.
Chcę aby dane można było podawać do programu na takie sposoby:
program plik
dane | program
program < plik
O ile obsługa pierwszego przypadku jest prosta gdyż argc zwraca liczbę argumentów ( 2 ) to w innych przypadkach mam problemy.
Gdy program wywołuję w taki np sposób: ls -l | program
to dane mogę sobie odczytać ze standardowego wejścia,
więc robię to tak:
while(getline(cin, line))
i zapisuję sobie kolejne linie do bufora. Jak potem wrócić do standardowego wejścia? stdin jest podmieniony i ncurses dziwnie się zachowuje, czyta ciągle -1. Przeszukując fora znalazłem takie rozwiązanie: stdin = fopen("/dev/tty", "r");
Czyjest ono w miarę uniwersalne pod systemami linuxowymi? Dzięki niemu ncruses przestaje samoczynnie wczytywać ciągle -1 i pobiera dane wprowadzane z klawiatury.
Drugi mój problem polega na obsłudze wywołania programu prostym poleceniem: `program</code>Podpada on pod drugi i trzeci sposób gdyż argc = 1 lecz program zapętla się na wczytywaniu wyżej wymienioną pętlą while<code class="cpp">(getline(cin, line))` która w przypadku wywołań
```cpp
dane | program
program < plik
działa idealnie.
Jakim warunkiem to obsłużyć? Próbowałem takim sposobem:
if(stdin == fopen("/dev/tty", "r")) /*Chodzi mi o sprawdzenie czy stdin nie jest podmieniony przez przekierowanie więc użytkownik nie dał żadnych danych do programu*/
{
cout <<"Wrong filename!"<<endl;
}
else
{
while(getline(cin, line))
{
/*do bufora*/
}
}
ale nie chce śmigać dalej się zapętla.
Dodatkowo wklejam cały blok odpowiedzialny za obsługę wejścia gdy argc = 1 czyli jest przekierowane oraz stdin jest przywracany sposobem wyżej podanym:
else if(argc == 1)
{
if(stdin == fopen("/dev/tty", "r"))
{
cout <<"Wrong filename!"<<endl;
run = false;
}
else
{
while(getline(cin, line))
{
/*do bufora*/
}
stdin = fopen("/dev/tty", "r");
run = true;
}
}
Wszystko działa dobrze ( na moim systemie ) ale uruchomenie programu
program
zawiesza go.
Jak temu zaradzić?