2013-02-13 9 views
12

Gibt es einen Umstand, wenn std::cout << "hello" nicht funktioniert? Ich habe einen C/C++ Code, aber die std::cout druckt nichts, nicht einmal konstante Zeichenfolgen (wie "Hallo").Std :: Cout wird nicht gedruckt

Gibt es eine Möglichkeit zu überprüfen, ob cout den Stream öffnen kann/kann? Es gibt einige Mitgliedsfunktionen wie good(), bad(), ... aber ich weiß nicht, welcher für mich geeignet ist.

+7

Ah, gepufferte Ausgabe, obwohl Kunst ein herzloses und grausames Mädchen. – WhozCraig

+3

Es gibt kein 'std :: cout' in C. –

+0

In einem Windowing-System kann das' std :: cout' nicht implementiert werden, da es Windows gibt und das Betriebssystem nicht weiß, in welches Ihrer Fenster es ausgegeben werden soll. –

Antwort

29

Stellen Sie sicher, dass Sie den Stream spülen. Dies ist erforderlich, da die Ausgabeströme gepuffert sind und Sie keine Garantie dafür haben, wann der Puffer geleert wird, es sei denn, Sie löschen ihn manuell.

std::cout << "Hello" << std::endl; 

std::endl ausgeben wird eine Neuer-Zeile und spült den Strom. Alternativ dazu std::flush wird nur die Spülung tun. Flushing kann auch der Member-Funktion Stream unter Verwendung erfolgen:

std::cout.flush(); 
+1

+1 oder entweder 'std :: cout <<" hallo \ n "' –

+0

kein Unterschied :( – mahmood

+3

@GrijeshChauhan Seit wann wird nur ein Zeilenumbruchzeichen an einen formatierten Ausgabestrom gesendet, um einen Flush zu erzwingen? Content-aware über Flushes, basierend auf Membern ('flush()') und Manipulatoren ('endl'), um einen Stream-Buffer flux auszulösen? War es seit einem bestimmten C++ - Standard so? – WhozCraig

5

Es ist wahrscheinlich, dass std::cout nicht aufgrund Pufferung funktioniert (was Sie schreiben in dem Puffer endet der std::cout statt in der Ausgabe).

Sie können eines dieser Dinge tun:

  • bündig std::cout ausdrücklich:

    std::cout << "test" << std::flush; // std::flush is in <iostream> 
    

    std::cout << "test"; 
    std::cout.flush(); // explicitly flush here 
    

    std::cout << "test" << std::endl; // endl sends newline char(s) and then flushes 
    
  • Verwenden Sie stattdessen std::cerr. std::cerr ist nicht gepuffert, verwendet jedoch einen anderen Stream (d. H., Die zweite Lösung funktioniert möglicherweise nicht, wenn Sie mehr als "Nachricht auf Konsole anzeigen" möchten).

+0

Keiner von ihnen arbeitete in meinem Code. –

1

deaktivieren effektiv Pufferung Sie diese anrufen: Alternativ

std::setvbuf(stdout, NULL, _IONBF, 0); 

können Sie Ihr Programm aufrufen und die Ausgabe-Pufferung in der Befehlszeile deaktivieren:

stdbuf -o 0 ./yourprogram --yourargs 

Halten Sie in diesem Geist wird normalerweise nicht aus Leistungsgründen durchgeführt.