ios::sync_with_stdio nach freopen benötigt?



  • Hi,

    ich benutze die Funktion freopen um die Standardstreams (stdout, stdin, stderr) in andere Dateien umzuleiten.

    Sollte/Muss man nach dem Aufruf von freopen die Memberfunktion ios::sync_with_stdio aufrufen, wenn man mit cout/cin/cerr arbeitet oder hat das damit nichts zu tun?

    Bye.



  • Mixe nie C IO mit C++ IO

    Warum willst du denn freopen() verwenden??
    in c++ geht das auch (siehe rdbuf())



  • Also es geht um folgendes:

    Ich habe eine WinAPI Fensteranwendung (WinMain Eintrittspunkt).

    Da ich aber auch nebenher eine kleine Debug-Console brauche, habe ich mir mit AllocConsole() eine beschafft.

    Nun sind aber die Standardstreams nicht initialisiert bzw. nicht auf diese neue Konsole initialisiert und somit kann ich keine Ein- und Ausgabe tätigen.

    Deshalb hab ich mit folgendem Code die Standardstreams auf die neue Konsole umgelenkt:

    freopen("CONOUT$", "w", stdout);
    freopen("CONOUT$", "w", stderr);
    freopen("CONIN$", "r", stdin);
    

    Damit funktioniert es auch wie gewünscht. Ich hatte nur in einem Codebeispiel noch gesehen das dannach ios::sync_with_stdio aufgerufen wird.

    Meine Frage ist nun ob dieser Aufruf wirklich benötigt wird.
    (Ich bin der Meinung das er nicht benötigt wird).

    C IO und C++ IO mixe ich nicht.



  • Ich habe jetzt auch mal die reine C++ Lösung versucht, doch es gibt Probleme mit der Eingabe. Hier erstmal der Code:

    #include <windows.h>
    #include <iostream>
    #include <fstream>
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	::AllocConsole();
    
    	std::ofstream consoleOut("CONOUT$");
    	std::cout.rdbuf(consoleOut.rdbuf());
    	std::cerr.rdbuf(consoleOut.rdbuf());
    
    	std::ifstream consoleIn("CONIN$");
    	std::cin.rdbuf(consoleIn.rdbuf());
    
    	std::cout << "std::cout" << std::endl; // funktioniert
    	std::cout << "std:cerr" << std::endl; // funktioniert
    	std::cin.get(); // die Funktion wird nie verlassen
    
    	return 0;
    }
    

    Bei std::cin.get() kann ich zwar Eingaben machen, aber wenn ich auf Enter drücke, geht er nur eine Zeile tiefer in der Konsole. Ich komme also aus der Funktion nicht mehr raus. Das selbe mit std::getline().

    Woran könnte das liegen?


Anmelden zum Antworten