Jak przekierować standardowe wejście i wyjście?
Obecnie programy, będące rozwiązaniami zadań, mają wczytywać dane wejściowe ze standardowego wejścia i zapisywać dane wyjściowe na standardowe wyjście. Jeśli uruchomimy program w najprostszy możliwy sposób, np. po to, żeby go przetestować, to wczytuje on dane z klawiatury, a wynik zapisuje na ekranie. Często chcielibyśmy jednak, żeby program pobrał dane z pliku i/lub do pliku zapisał. Można to zrobić przekierowując standardowe wejście i wyjście. Poniżej na przykładach pokazujemy, jak to zrobić w linii poleceń w systemach opracyjnych Windows i Linux.
Windows
Załóżmy, że mamy plik wykonywalny abc.exe w bieżącym katalogu. Aby wczytywał on dane z pliku abc.in piszemy następujące polecenie:
abc.exe < abc.in
Natomiast jeśli chcemy, aby zapisywał dane wyjściowe do pliku abc.out, to piszemy:
abc.exe > abc.out
ale musimy uważać, jeśli plik abc.out już istniał, bo utracimy jego dotychczasową zawartość. Oczywiście możemy zarówo z pliku wczytywać, jak i do pliku pisać, wykonując jedno z poniższych poleceń:
abc.exe < abc.in > abc.out abc.exe > abc.out < abc.in
Powłoka PowerShell w Windowsie
PowerShell to nowa powłoka systemowa od MS dla systemów Windows (oparta na .NET). W aktualnej wersji nie działa w niej operator przekierowania standardowego wejścia '<' i trzeba sobie poradzić inaczej:
Get-Content abc.in | .\prog.exe > abc.out
Dziękujemy Łukaszowi Niemierowi za podzielenie się powyższą wskazówką.
Linux
Załóżmy, że mamy plik wykonywalny abc w bieżącym katalogu. Aby wczytywał on dane z pliku abc.in piszemy następujące polecenie:
./abc < abc.in
Natomiast jeśli chcemy, aby zapisywał dane wyjściowe do pliku abc.out, to piszemy:
./abc > abc.out
ale musimy uważać, jeśli plik abc.out już istniał, bo utracimy jego dotychczasową zawartość. Oczywiście możemy zarówo z pliku wczytywać, jak i do pliku pisać, wykonując jedno z poniższych poleceń:
./abc < abc.in > abc.out ./abc > abc.out < abc.in