string s;
while(getline(cin,s)){
cout << "---" << endl
for(auto c: s) cout << int(c) << endl;
}
cout << "Exiting";
Si mon entrée est Ctrl +Z, alors j'appuyez sur ENTRÉE une fois, et mon programme quitte immédiatement.comportement Ctrl + Z dans le terminal
^Z
Exiting
Si j'entrer un caractère avant d'appuyer sur Ctrl + Z , je dois appuyer sur entrer deux fois, et mon programme ne sort pas.
s^Z
---
115
26
J'avais toujours interprété Ctrl +Z comme le caractère EOF. getline
continuerait jusqu'à ce qu'il atteigne ce caractère, à quel point getline
teste faux et mon programme se terminerait. Je suis curieux de savoir pourquoi mon programme interprète Ctrl + Z comme le substitute character 26, selon qu'il y a un caractère précédent ou non, et pourquoi il m'a fallu appuyer deux fois sur Entrée dans le deuxième exemple?
Ctrl + Z au début de la ligne est gérée par la même console Windows, mais bizarrement, c'est seulement pour un appel générique ['ReadFile'] (https://msdn.microsoft.com/en-us/library/aa365467), pas pour l'appel' ReadConsole' spécifique. Dans ce cas, la lecture renvoie 'lpNumberOfBytesRead' comme 0, ce que le runtime C/C++ interprète comme EOF. – eryksun
Avoir à appuyer deux fois sur Entrée dans le second exemple est impair. Il garde le caractère SUB ("\ x1a") dans le tampon et supprime tout après, y compris la fin de ligne CRLF. S'il ne gardait pas SUB dans le résultat, il serait presque compréhensible, puisque les runtimes Windows C et C++ traitent ce caractère comme un marqueur EOF. ISTM le comportement correct ici devrait être de retourner de 'getline' avec tout ce qui a précédé SUB sur la ligne, de ne pas le garder dans le tampon et continuer à lire. – eryksun