Wenn fertig, bitte Fenster schließen
Das vollständige Signatur der cin-Memberfunktion getline(...) sieht wie folgt aus:
|
istream& getline (char *pBuffer, int noOfChars, char del = '\n'); |
Der erste und zweite Parameter wurde ja bereits erläutert. Der letzte Parameter spezifiziert das Zeichen, mit dem die Eingabe abgeschlossen wird. Standardmäßig ist dies der Zeilenvorschub.
Für die Arbeitsweise von getline(...) gilt nun folgendes: getline(...) liest so lange Zeichen von der Tastatur ein, bis die <RETURN>-Taste gedrückt wird, unabhängig vom Abschlusszeichen. Im Anschluss daran wird die Eingabe überprüft. Zuerst wird die Eingabe auf das Vorhandsein des Abschlusszeichens (3. Parameter von getline(...)) hin untersucht. Jetzt können zwei Fälle auftreten:
1.) Das Abschlusszeichen ist vorhanden. Enthält die Eingabe dann vor dem Abschlusszeichen maximal noOfChars Zeichen, so wird die Eingabe bis zum Abschlusszeichen in das übergebene Feld umkopiert. Anschließend wird das Abschlusszeichen aus der Eingabe entfernt. Befinden sich dann noch weitere Zeichen in der Eingabe, so verbleiben diese dort und werden dem nächsten cin zur weiteren Bearbeitung übergeben. Wie Sie diesen 'Rest' der Eingabe aus dem Eingabepuffer entfernen können ist im nachfolgenden Beispiel nochmals aufgeführt.
2.) Das Abschlusszeichen fehlt. Dann liest die Memberfunktion getline(...) so lange weitere Zeichen ein, bis das Abschlusszeichen in einer Eingabe gefunden wird. Sehen Sie sich dazu einmal folgenden Fall an:
| Anweisung: cin.getline(feld,20,'$'); // $ ist Abschlusszeichen Eingabe: 123<RETURN> 456<RETURN> 78$9<RETURN> Ausgabe: 123<RETURN> 456<RETURN> 78 |
Wie Sie der Ausgabe entnehmen können, werden in diesem Fall sogar die 'RETURN's mit im Feld abgespeichert.
Und noch ein weiteres, komplettes Beispiel zu getline(...).
|
#include <iostream> #include <limits> using std::cout; using std::cin; using std::endl; // main() Funktion int main () { // Feld zur Aufnahme der Eingabe definieren char array[40]; // Hinweis ausgeben cout << "Bitte 1. Text eingeben: "; // Zeile einlesen bis '.' gefunden wurde oder Feld gefüllt ist. // Der Operator sizeof() liefert die Größe des Feldes in Bytes cin.getline(array, sizeof(array),'.'); // Eingabe wieder ausgeben cout << "1. Eingabe war: " << array << endl; // Restliche Eingabe verwerfen cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Hinweis ausgeben cout << "Bitte 2. Text eingeben: "; // Nächste Zeile einlesen cin.getline(array, sizeof(array),'.'); // Eingabe wieder ausgeben cout << "2. Eingabe war: " << array << endl; } |
|
Bitte 1. Text eingeben:
Erster Satz. Zweiter Satz. |
Im Beispiel wird für die Berechnung der maximal einzulesenden Zeichen beim Aufruf der Memberfunktion getline(...) der Operator sizeof verwendet. sizeof ist ein Standard C++-Operator, der den von einer Variable oder eines Datentyps belegten Speicherplatz in Bytes zurückliefert. Im Beispiel liefert sizeof(array) die Größe des Eingabepuffers array, hier also 40. Die erste Eingabe wird nun beendet wenn mind. 39 Zeichen oder aber ein Punkt eingegeben wurden. Diese Eingabe wird dann zur Kontrolle ausgegeben. Beachten Sie bei der Ausgabe, dass nur die Eingabe bis zum Punkt übernommen wurde. Die restlichen eingegebenen Zeichen befinden sich aber noch im Eingabepuffer. Um diese Zeichen zu verwerfen wird die Memberfunktion ignore(...) des Eingabestreams aufgerufen. Sie können das Programm zum Testen auch einmal in Ihren Compiler übernehmen und dann ausprobieren was passiert, wenn Sie den Aufruf von ignore(...) entfernen.