2016-05-26 33 views
-1

Ich frage mich, warum der folgende Code nicht wie erwartet:ios_base :: sync_with_stdio (false) nicht zwischen zwei Eingängen arbeiten stdin

#include <iostream> 
#include <string> 
using namespace std; 

int main(){ 
    int n; 
    string s; 
    //scanf("%d",&n); 
    cin >> n; 
    ios_base::sync_with_stdio(false); 
    cin >> s; 
    cout << n << " " << s; 
    return 0; 
} 

Eingang:

10 
abcd 

Ausgang: 10

Die Zeichenfolge wird nicht gedruckt! Das Ergebnis ist dasselbe, wenn ich scanf verwende, um die Ganzzahl einzugeben. Der Code funktioniert jedoch wie erwartet, wenn die Zeile ios_base::sync_with_stdio(false); stattdessen vor dem ersten cin (oder vor dem scanf) platziert wird.

Ich würde jede Hilfe sehr schätzen, dieses Verhalten zu klären.

Edit: Die Eingänge in einer Datei enthalten sind inp.txt und ich bin mit < (Re-Richtung Operator) aus der Datei und > zur Ausgabe an out.txt das Ergebnis zu lesen, wie: a.out <inp.txt> out.txt

Der Code gibt die erwartete Ausgabe, wenn die Eingaben direkt von der Konsole stammen. Entschuldigung für Missverständnisse oder Verwirrung.

+3

Diese [Dokumentation] (http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio) besagt, dass 'sync_with_stdio()' der erste Aufruf des 'io' Systems sein muss. - * "Es ist eine Implementierungsdefinition, wenn diese Funktion eine Auswirkung hat, wenn sie aufgerufen wird, nachdem einige E/A im Standardstream aufgetreten sind." * – Galik

+0

Add << endl löscht die Ausgabe möglicherweise nicht. (Nicht sicher, wie es in C++ in c funktioniert, wenn das Programm beendet wird stdout wird geleert) –

+0

@Mr. Zweig: Wo soll ich << endl hinzufügen? Wie wäre es hilfreich, wenn 'stdout' gespült wird? (Ich denke, das Problem liegt hier bei 'stdin', nicht' stdout'.). –

Antwort

1

Aufruf sync_with_stdionach I/O-Leitungen zur Implementierung definiert Verhalten durchgeführt wurde (die stärkere Formulierung als cppreference der ist „keine Auswirkungen hat“):

Effekte: Wenn ein Ein- oder Ausgang Betrieb ist mit den Standard-Streams vor dem Aufruf aufgetreten, der Effekt ist Implementierung definiert. Andernfalls, mit einem falschen Argument aufgerufen, ermöglicht es den Standardströmen, unabhängig von den Standard C Streams zu arbeiten.

In libC++ passiert nichts, weil es nur ein Flag umschaltet. In libstdC++ führt es tatsächlich logic aus, um die Streams zu wechseln. Alle weiteren Versuch, die Ströme zu einem Fehler zu verwenden:

cin >> s; 
cin.clear(); 
cin >> s; 
std::cout << n << " " << s; 

So oder so, the libstdc++ manual heißt Sie müssen die Funktion vor Durchführung I/O nennen. Was Sie eigentlich haben, ist jetzt undefiniertes Verhalten.

+0

Mein Code gibt keine erwartete Ausgabe aus, wenn er mit einer Datei kombiniert wird, die mit '<' operator gelesen wird. Für Eingaben, die direkt in der Konsole eingegeben werden, funktioniert es einwandfrei. –

+0

@SnehasishKarmakar Wenn Sie die Konsole verwenden, gibt es keinen Puffer, in dem die Eingabezeichenfolge verloren gehen kann – Cubbi