2016-05-26 3 views
-1

Je me demande pourquoi le code suivant fonctionne pas comme prévu:ios_base :: sync_with_stdio (false) ne fonctionne pas entre deux entrées de 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; 
} 

Entrée:

10 
abcd 

Sortie: 10

La chaîne ne s'imprime pas! Le résultat est le même si j'utilise scanf pour entrer l'entier. Cependant, le code fonctionne comme prévu si la ligne ios_base::sync_with_stdio(false); est placée avant la première cin (ou avant la scanf) à la place.

J'apprécierais hautement toute aide pour clarifier ce comportement.

Edit: Les entrées sont contenues dans un fichier inp.txt et j'utilise < (opérateur re-direction) pour lire à partir du fichier et > pour délivrer en sortie le résultat à out.txt, comme: a.out <inp.txt> out.txt

Le code donne la sortie attendue si les entrées sont données directement depuis la console. Désolé pour tout malentendu ou confusion.

+3

Cette [documentation] (http://fr.cppreference.com/w/cpp/io/ios_base/sync_with_stdio) indique que 'sync_with_stdio()' doit être le premier appel du système 'io'. - * "Il est défini par l'implémentation si cette fonction a un effet si elle est appelée après que certaines E/S se soient produites sur le flux standard." * – Galik

+0

Add << endl risque de ne pas rincer la sortie. (Je ne sais pas comment cela fonctionne en C++ en c quand le programme se termine stdout est vidé) –

+0

@Mr. Branche: Où devrais-je ajouter '<< endl'? En outre, comment serait-il utile si 'stdout' est rincé? (Je pense que le problème ici est avec 'stdin', pas' stdout'.). –

Répondre

1

Appel sync_with_stdioaprès I/O a été réalisée conduit à un comportement défini la mise en œuvre (qui est plus fort libellé que cppreference de « a un effet »):

Effets: Si une entrée ou une sortie l'opération a eu lieu en utilisant les flux standards avant l'appel, l'effet est défini par l'implémentation. Sinon, appelé avec un faux argument, permet aux flux standard de fonctionner indépendamment des flux C standard.

Dans libC++, rien ne se passe car tout ce qu'il fait est de basculer un drapeau. Dans libstdC++, il exécute effectivement logic pour basculer les flux. Toute autre tentative d'utiliser les flux de résultats en échec:

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

De toute façon, the libstdc++ manual indique que vous devez appeler la fonction avant d'effectuer E/S. Donc, ce que vous avez réellement est un comportement indéfini maintenant.

+0

Mon code ne donne pas de sortie attendue lorsqu'il est combiné avec le fichier lu avec l'opérateur '<', pour les entrées données directement dans la console, cela fonctionne correctement. –

+0

@SnehasishKarmakar lorsque vous utilisez la console, il n'y a pas de tampon pour perdre votre chaîne d'entrée dans – Cubbi