Binomischer Baum Problem

sfuccma

Grünschnabel
Hallo, an alle!

Ich hab folgendes Problem bezüglich des Aufgabaus eines Binomischen Baumes.
Die Aufgabe lautet aus "n" Zahlen eine BinoBaum zu erstellen.
Aber ich komm nicht mal zum Abschluss des Erstellens der n Wurzeln bei Stufe 0.
Mein Compiler GNU g++ hört nach dem 25-ten durchlauf meiner Schleife auf mit einer Fehlermeldung, die ich nicht beheben kann.

Vielleicht könnt ihr mir helfen:
P.S.:die Zahlen werden von einer Datei eingelesen.

Hier der Codeauszug:

Code:
int main(int argc,char **argv)
{
	BinoBaum **b;
	unsigned int help(0);
	ifstream in(argv[1]);
	int i=0;

	if(!in) {
		cout << "Fehler bei Dateioeffnung!" << endl;
		return -1;
	}
	
	while(!in.eof()) {
		char c=in.get();
		if(c!=' ') {
			help=(help*10)+(atoi(&c));
		}
		else {
			b[i] = new BinoBaum(help);
			help=0;
			i++;
		}
	}

	return 0;
}

FehlerMeldung:

Code:
terminate called after throwing an instance of 'std::ios_base::failure'
  what():  basic_ios::clear
Aborted
danke schonmal im vorraus

EDIT:::

Bevor ich es vergesse..... Ich nutze Ubuntu 9.10 Netbook Remix.
 
Zuletzt bearbeitet:
Hi.
Code:
while(!in.eof()) {
  char c=in.get();
  ...
}
So geht das auch nicht. Man kann .eof nicht auf diese Weise verwenden. Und in.get() gibt einen int zurück, du müßtest dann erstmal prüfen ob dieser nicht EOF ist.
C++:
char c;
while (in.get(c)) {
  ...
}
Gruß

Außerdem kannst du atoi nicht mit einem einzelnen Zeichen verwenden. Du mußt einen \0 terminierten String übergeben.

Wenn du Integerwerte einlesen willst, warum liest du denn dann zeichenweise ein?
C++:
unsigned int value;
while (in >> value) {
  ...
}

Weiterhin hast du keinen Speicher für den Baum alloziert.
 
Zuletzt bearbeitet:
Hi!
Dank erstmal für deine Antwort.

Meines Wissens kann man auf eof() testen in einer while schleife so wie es habe.

Code:
bool eof() const;

The function returns true if the eofbit stream's error flag has been set by a previous i/o operation. (Quelle: http://www.cplusplus.com)

Demnach kann in meiner Schleife kein char eingelesen werden, der eventuell EOF ist, denn wenn in.eof() true wird, wird die Schleife nicht mehr ausgeführt.
Demnach ließt er auch kein char mehr ein, der EOF sein könnte.

Mit dem get() muss ich dir Recht geben, da hab ich nen Fehler gemacht - ebenso mit dem atoi.

Für mein Feld alloziere ich doch dynamisch Speicher mit:

Code:
b[i] = new BinoBaum(help);

Dabei ist help die zuvor eingelesene Zahl.
Oder ist dies auch verkehrt?

Danke für eure Hilfe

mfg
sfuccma
 
Meines Wissens kann man auf eof() testen in einer while schleife so wie es habe.
Nein, kann man nicht. Es macht (meistens) keinen Sinn.
Code:
bool eof() const;

The function returns true if the eofbit stream's error flag has been set by a previous i/o operation. (Quelle: http://www.cplusplus.com)

Demnach kann in meiner Schleife kein char eingelesen werden, der eventuell EOF ist, denn wenn in.eof() true wird, wird die Schleife nicht mehr ausgeführt.
Demnach ließt er auch kein char mehr ein, der EOF sein könnte.
Das ist falsch. Wann wird denn das eofbit gesetzt? ;-]
Für mein Feld alloziere ich doch dynamisch Speicher mit:
Code:
b[i] = new BinoBaum(help);
Nein, tust du nicht. Du allozierst Speicher für ein neues BinoBaum Objekt, aber versuchst das an b[i] zuzuweisen, was du aber noch nicht mal initialisiert hast.
C++:
BinoBaum **b = 0;
b = new BinoBaum*[20]; // ein (dyn) Array von 20 BinoBaum Zeigern.
Gruß
 
Zurück