Przez większość mojego życia używałem cstdio
. Teraz próbuję przejść na iostream
.Uruchom plik .exe i przekieruj standardowe wejście i wyjście
Załóżmy, że mam osobny program o nazwie "foo.cpp", który wygląda tak:
int main(){ // foo.cpp
int x;
std::cin >> x;
std::cout << x + 5 << "\n";
}
w innym programie o nazwie "bar.cpp" wzywam wykonywalny foo. W przeszłości, gdybym chciał przekierować stdin i stdout do pliku, użyłbym freopen
tak:
int main(){ // bar.cpp, redirecting stdin and stdout
freopen("foo.in", "r", stdin); // Suppose "foo.in" contains a single integer "42"
freopen("foo.out", "w", stdout);
system("foo.exe"); // "foo.out" will contain "47"
}
Teraz próbuję przekierować std::cin
i std::cout
do stringstreams. Coś takiego:
int main(){ // bar.cpp, redirecting cin and cout
std::istringstream instr("62");
std::ostringstream outstr;
std::cin.rdbuf(instr.rdbuf());
std::cout.rdbuf(outstr.rdbuf());
system("foo.exe"); // outstr should contain "67"
}
Ale czego się nauczyłem, że std::cin
i std::cout
nie został przekierowany podczas wykonywania „foo.exe”. Program oczekuje teraz wprowadzenia użytkownika i wydrukuje do std::cout
. Po wykonaniu "foo.exe", std::cin
i w obrębie "bar.cpp" nadal pozostały przekierowane odpowiednio do instr
i .
Moje pytanie brzmi, czy jest jakiś sposób, aby to zrobić z iostream
, tak jak zamierzałem, czy utknąłem przy użyciu freopen
?
System operacyjny odpowiada za przetwarzanie danych wyjściowych plików wykonywalnych. Język C++ nie ma możliwości przekierowania wyjścia. –
Typowe rozwiązania do dzielenia danych między programami: pliki, gniazda, orurowanie (powiedz systemowi operacyjnemu wyjście potoku innego programu na standardowe wejście dla twojego programu), obszary pamięci współużytkowanej. Przeszukaj internet. –
Czy próbowałeś już wykonywać te same połączenia freopen? – stark