ifstream und stringstream Problem

kle-ben

Erfahrenes Mitglied
Hi !

Ich habe 2 Probleme beim einlesen und umwandeln einer Datei.
Ich habe eine .txt Datei in der in jeder Reihe 1 Zahl steht.

1 Problem:
Zuerst will ich die Anzahl der Zeilen ermitteln.

Code:
ifstream infile( file );
while( !infile.eof() )
{
   string temp;
   getlie( infile, temp );
   ++size;
}
infile.close()
Erstelle ich nun wieder
Code:
ifstream infile( file );
gibts Mäcker vom Compiler da der stream vorher bereits deklariert wurde.
Allerdings habe ich es doch mit close() wieder geschlossen.
Benutze ich den filestream nun weiterhin funktioniert er ja nicht mehr a ich am
ende der Datei bin und nichts mehr zum einlesen da ist.
Benenne ich den stream anderst erhalte ich folgende Fehlermeldung:

*** glibc detected *** malloc(); memory corruption: 0x0804c1d0 ***
Abgebrochen

Problem 2:

Ich hab nun die Größe von Hand festgesetzt um den rest der Einlesefunktion
zu testen:
Code:
size =  6;
a = new int( size );

ifstream infile( file );
for( int i = 0; i < size; ++i )
{
   string temp; 
   getline( in, temp );
   stringstream stream;
   stream << temp;
   stream >> a[i];
   stream.clear();
}
infile.close()
Nun erhalte ich nur das erste Element aus der Datei, dann erhalte ich die selbe
Fehlermeldung wie oben. Deklariere ich den stream vor der for-Schleife dann
bekomme ich zwar alle Ellemente, allerdings auch wieder die Fehlermeldung.

Wo ist der Fehler an Sache was mache ich falsch?

Gruß Benny
 
Mit open öffnet man einen inputFileStream.
Der Konstruktor ruft die Methode halt nur selbstständig auf.
Da das ifstream Objekt beim zweiten Mal schon existiert kannst Du es also auch nicht ein zweites Mal anlegen, deswegen benutzt man an der Stelle ifstream::open

C++:
ifstream eingabeFile (dateiName1);
// ERSTE SCHLEIFE
eingabeFile.close();

eingabeFile.open(dateiName2);
//ZWEITE SCHLEIFE
eingabeFile.close();
 
Ah okay danke das funktioniert.

Und die andere Fehler habe ich nun auch wegbekommen.

Und zwar muss sowohl das open() als auch die Deklaration
des stringstream vor

Code:
a = new int(size);

stehen. Kann mir jemand erklären wieso das so ist womit das zusammen hängt ?

bye Benny
 
kle-ben hat gesagt.:
Und zwar muss sowohl das open() als auch die Deklaration
des stringstream vor

Code:
a = new int(size);

stehen.
Die Reihenfolge der Anweisungen dürfte egal sein. Allerdings legst du mit dieser Anweisung einen einzelnen int auf dem Heap an der den Wert size hat.

Wenn du ein Array von int der Größe size allozieren willst machst du das so:
C++:
int* a = new int[size];
...
delete[] a;
Oder besser du verwendest einfach einen std::vector.

Gruß
 
Zuletzt bearbeitet:
Ich dachte auch das die Reihenfolge der Anweisungen egal ist,
allerdings erhalte ich diesen Fehler wenn ich es nicht vor ziehe.
Und a ist vom Typ int* man sieht es nur nicht da sich das Ganze
in eiener Klasse befindet, und da ich das Feld dann sortieren möchte
kann ich es nicht in einen Vector stecken.Aber danke.

Benny
 
kle-ben hat gesagt.:
Ich dachte auch das die Reihenfolge der Anweisungen egal ist,
allerdings erhalte ich diesen Fehler wenn ich es nicht vor ziehe.
Dein Code ist falsch. Du hast nur einen einzelnen Integer alloziert und überschreibst wenn du a als Array benutzt (a ist nur ein Array mit einem Element) irgendwelchen Speicher der nicht (für a) alloziert wurde. Wenn du die Anweisungen vertauschst ist es im Grunde Zufall das es dann (vermeintlich) funktioniert.
kle-ben hat gesagt.:
Und a ist vom Typ int* man sieht es nur nicht da sich das Ganze
in eiener Klasse befindet, und da ich das Feld dann sortieren möchte
kann ich es nicht in einen Vector stecken.Aber danke.
Einen Vektor kann man auch sortieren. :confused:

Gruß
 
Einen Vektor kann man auch sortieren.

Ja ich weiß, meine Sortierfunktion ist allerdings nur für Felder,
und da ich nicht alles umschreiben will...

Noch mal zu dem Fehler, so ganz hab ichs nicht verstanden.
Ich weise a doch mit
Code:
a = new int( size );
neuen Speicher zu.
Muss ich bevor ich a neuen Speicher zuweise erst
Code:
delete a[];
sagen, damit es richtig funktioniert?

Benny
 
kle-ben hat gesagt.:
Noch mal zu dem Fehler, so ganz hab ichs nicht verstanden.
Ich weise a doch mit
Code:
a = new int( size );
neuen Speicher zu.
Du verwendest da runde Klammern. Diese werden zur Übergabe eines Initialisierungswertes verwendet. D.h. du allozierst Speicher für einen int der dann den Wert von size bekommt.

Was du offenbar machen möchtest ist einen Block von Speicher für ein Array von int's anzulegen. Dazu verwendet man dann den new[] Operator. (eckige Klammern!) Der Wert innerhalb der eckigen Klammern gibt dann die Anzahl der Elemente an für die Speicher alloziert werden soll.

Zum Freigeben von Speicher der mit new[] alloziert wurde muß man den delete[] Operator verwenden.

Gruß
 
Hm genau genommen kenn ich die Notationmit ( ) nicht mal.
Dann wars wohl wirklich nur Zufall. Aber nun ist alles klar.

Danke!

Gruß Benny.
 
Zurück