# C++ getline macht probleme



## phpMars (2. Dezember 2005)

Ich bin gerade bei OOP und wollte folgendes Programm zum einstieg mal machen, aber irgendwie habe ich Probleme mit meiner getline Funktion.


```
//----------------OOP - Konto--------------------
# include <iostream>
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <stdio.h>
# include <string>
# include <algorithm>
using namespace std;
//---------------Stephan Liebig 2005-------------

# ifdef WIN32
# ifdef __BORLANDC__
# include <conio.h>
# else

void clrscr(void) {
	system ("cls");
}
# endif
# else /* WIN32 */
void clrscr(void) { }
# endif


class Konto
{
private:
	int Kontonummer;
	string KtoInhaber;
	float Stand;

public:
	void setData();
	void getData();
};

void Konto::setData()
{
	cout << "Bitte geben Sie Ihre Kontonummer ein: ";
	cin >> Kontonummer;
	cout << endl << "Bitte geben Sie den Kontoinhaber ein: ";
	cin.getline >> KtoInhaber;
	cout << endl << "Bitte geben Sie den Kontostand ein: ";
	cin >> Stand;
}
void Konto::getData()
{
	cout << endl << "Ihre Daten: " << endl;
	cout << "Ihre Kontonummer: " << Kontonummer << endl;
	cout << "Kontoinhaber: " << KtoInhaber << endl;
	cout << "Ihr Kontostand: " << Stand << endl;
}

void main(void)
{
	Konto giro;
	giro.setData();
	giro.getData();

	getchar();
}
```

Kann mir jemand sagen wo der Fehler ist ?


----------



## Onkel Schuppig (2. Dezember 2005)

Probiere bitte mal

```
getline(cin, KtoInhaber);
```
Grüße OS


----------



## canuzzi (2. Dezember 2005)

Ja. Also: 
Du benutzt 

```
cin.getline >>
```
Das ist aber die Variante zum einlesen von c char Strings in der Fom

```
cin.getline(char* string, int size)
```
Du liest einen c++ String ein, dass machst du mit:

```
getline(cin, buffer)
```
Dann musst du noch Aufpassen, dass das vorher das letzte Return noch im Buffer ist, das wirst du ZB mit 
	
	
	



```
cin.get()
```
 lost.
Ahja eine main sollte int zuruecjgeben!


----------



## phpMars (3. Dezember 2005)

Was die main(); betrifft ist es hier egal, da ich keinen Rückgabewert erhalte, müsste ich return 0; verwenden und das kann ich mir ja mit void main(void) sparen


----------



## Tobias K. (3. Dezember 2005)

moin




> Was die main(); betrifft ist es hier egal, da ich keinen Rückgabewert erhalte, müsste ich return 0; verwenden und das kann ich mir ja mit void main(void) sparen


Und trotzdem ist das ein schlechter Stil.


mfg
umbrasaxum


----------



## The_Rave (28. Januar 2006)

canuzzi hat gesagt.:
			
		

> Dann musst du noch Aufpassen, dass das vorher das letzte Return noch im Buffer ist, das wirst du ZB mit
> 
> 
> 
> ...



Wie werde ich jetzt das überflüssige Return im Buffer mit cin.get() los? Das einzige was ich damit hinbekomme ist, daß das Programm auf ein Enter von mir wartet.


----------



## Tobias K. (28. Januar 2006)

moin


Z.B. mit

```
fflush(stdin);
```


mfg
umbrasaxum


----------



## FireFlow (28. Januar 2006)

```
cin.ignore(cin.rdbuf()->in_avail());
```

Auf Deutsch: Liebes Cin, schaue mal in deinen Lesepuffer und ignoriere soviele Zeichen wie gerade da sind.

Das mit dem fflush lässt du in C++ besser sein das muss nicht immer klappen. Ist afaik eh net defined was da bei raus kommt wenn man iostreams verwendet.


----------



## The_Rave (29. Januar 2006)

Dankeschön, aber das fflush funktioniert bei mir irgendwie nicht. Ich hab eine Datei offen und will die auslesen. Getline schnappt sich aber die Zeilenumbrüche in der Datei und die landen in meinem Array. Da kann ich die "\n" aber überhaupt nicht gebrauchen. Warum ist das so schwer diesen Buffer clean zu bekommen bevor Getline loslegt? Hab mir jetzt was mit substr(1, array[z].name.length()) gebastelt und schneid das hinterher raus.


----------



## The_Rave (29. Januar 2006)

FireFlow hat gesagt.:
			
		

> ```
> cin.ignore(cin.rdbuf()->in_avail());
> ```



Funktioniert das auch wenn ich getline(streamobjekt, array[z].name, ':'); auf meinen IO-Stream loslasse oder funktioniert das nur mit cin?


----------



## FireFlow (29. Januar 2006)

Sollte mit jedem von istream klappen.


----------



## The_Rave (29. Januar 2006)

FireFlow hat gesagt.:
			
		

> Sollte mit jedem von istream klappen.


Hm. Ich hab das jetzt vor meine getline Anweisung eingefügt, aber es bewirkt nichts.


----------



## deepthroat (29. Januar 2006)

Hi.





			
				Micha139 hat gesagt.:
			
		

> Funktioniert das auch wenn ich getline(streamobjekt, array[z].name, ':'); auf meinen IO-Stream loslasse oder funktioniert das nur mit cin?


Wenn du angibst, das ein Doppelpunkt dein Zeilenendezeichen ist, dann wird natürlich nicht mehr auf das '\n' geachtet und das ist ein ganz normales Zeichen und landet im String.

Eine Möglichkeit wäre erstmal komplett die Zeile in einen String einzulesen und dann die Zeile an den Doppelpunkten zu splitten.

Du kannst ja mal im Forum suchen da müßte irgendwo eine split Funktion für Strings definiert worden sein.

Gruß


----------



## The_Rave (29. Januar 2006)

deepthroat hat gesagt.:
			
		

> Hi.
> Du kannst ja mal im Forum suchen da müßte irgendwo eine split Funktion für Strings definiert worden sein.



So sieht auch meine Lösung mit substr() im Moment aus, nur daß ich den Zeilenumbruch rausschneide. Das einzige was funktioniert. Der Delimiter scheint das problem zu sein.

.....

Ach ja nochmal zum Buffer leeren ein cin.ignore(INT_MAX, '\n'); tuts ünrigens auch, aber auch das funktioniert bei meinem Streamobjekt nicht, also weiter cutten...

Aber wißt ihr was da funktioniert... streamobjekt.ignore(INT_MAX, '\n'); oder streamobjekt.get(); Das mußte doch irgendwie gehen...


Gruß


----------



## MEETyA (3. März 2008)

Wenn ich mit getline einen String einlesen will, sagt mir MS Visual C++ :

cpp(51) : error C3861: "getline": Bezeichner wurde nicht gefunden.

Mit dem Bezeichner ist der String gemeint nehme ich an. Was mache ich also falsch?


```
string  eingabe;
			  size_t found;
                         getline(cin,eingabe);
						 found = eingabe.find("n");
                         
                         if( found == string::npos ) {
							werte[j] = eingabe - 0;
						 }
                         else {
							readingValues = false;
						 }
```


----------



## Laudian (3. März 2008)

naja ... so wie ich das sehe machst du einen entscheidenden Fehler...

die Syntax sieht naemlich wie folgt aus

cin.getline(Variable, Zeichenanzahl)


----------



## deepthroat (4. März 2008)

MEETyA hat gesagt.:


> Wenn ich mit getline einen String einlesen will, sagt mir MS Visual C++ :
> 
> cpp(51) : error C3861: "getline": Bezeichner wurde nicht gefunden.
> 
> Mit dem Bezeichner ist der String gemeint nehme ich an. Was mache ich also falsch?


Nein, mit dem Bezeichner ist der Bezeichner gemeint, der in der Fehlermeldung angegeben ist: *getline*. Du hast anscheinend vergessen den <string> Header, in der die getline Funktion definiert ist, mit zu include'n.

@Laudian: Was du meinst ist die getline Methode der istream Klasse, nützlicher ist aber die getline Funktion aus der <string> Headerdatei, weil man sich damit nicht um die Länge der Eingabe und Speicherallozierung kümmern muss.

Gruß


----------



## Onkel Schuppig (4. März 2008)

Prüf mal die includes:

```
#include <string>
#include <iostream>
using namespace std;
```
Übrigens, was bezweckst du mit 
	
	
	



```
werte[j] = eingabe - 0
```
 ?


----------

