007
11.08.2006, 17:18 Uhr
0xdeadbeef
Gott (Operator)
|
Aaaalso, langsam zum Mitschreiben:
UNIX und Derivate, sowie Amiga, BeOS usw. benutzen als newline-Zeichen schon seit Anbeginn der Computerzeit \n (ASCII 10). Der Apple ][ und macintosh haben bis MacOS 9 \r benutzt, seit MacOS X, das den Darwin-Kernel (der auf BSD 4.4 aufbaut) benutzt, ist auch da \n newline. CP/M, MS-DOS und Windows benutzen \r\n
Dann gibt es noch einige esoterischere ansätze, die heute aber kaum mehr benutzt werden (speziell ebcdic, und alte VMS-Kisten benutzten, glaube ich, eine Art Datenbankansatz). Um das ganze abzurunden, gibt es in unicode eine ganze reihe newline-charaktere / Zeichenfolgen, um das alles unter einen Hut zu bringen.
Beschränken wir uns auf die ersten drei Fälle, der Rest läuft euch bis auf unicode eh nicht über den weg, und da ist es egal, weil der alles kann. In C und C++ wird das so gelöst, dass es für Eingabeströme zwei Modi gibt - zum einen Text, zum anderen binär. Im Textmodus gelesene oder geschriebene Daten wandeln das plattformspezifische newline-Zeichen on the fly in ASCII 10 um, und so wird es dann intern weiterbehandelt. Am Beispiel:
C++: |
printf("Hallo, Welt!\n");
|
gibt unter UNIX "Hallo, Welt!\n" aus, unter Windows aber "Hallo, Welt!\r\n"
Daher übrigens auch die Möglichkeit,
C++: |
FILE *fd = fopen("foo.bar", "rb");
|
zu benutzen, was foo.bar binär zum Lesen öffnet. Wenn jetzt
C++: |
fprintf(fd, "Hallo, Welt!\n");
|
ausgeführt wird, schreibt das Programm unabhängig von der Plattform "Hallo, Welt!\n" in die Datei, was dazu führt, dass sie unter Windows nicht vernünftig dargestellt werden wird, sondern halt mit Kästchen und ohne Zeilenumbruch. Unter UNIX macht "rb" übrigens keinen Unterschied zu "r" und wird in aller Regel einfach ignoriert.
Was das ursprüngliche Problem angeht,
C++: |
char c; std::cin >> c;
|
wartet auf die Eingabe eines nicht-newline-Zeichens. Was hier gewollt ist, ist sowas wie
C++: |
while(std::cin.getc() != '\n');
|
Auf eine beliebige Taste zu reagieren, ist plattformabhängig und nicht unbedingt ganz trivial. Für UNIX hab ich hier: www.fun-soft.de/showtopic.php?threadid=5157 mal was dazu geschrieben, unter windows gibts in der conio.h die Funktion getch(), die im Grunde genau das macht. Allerdings muss auch da der stream geleert sein. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |