C++ Fehler beim Zeilenweiser auslesen einer csv Datei in Vector

Mollfred

Cadet 3rd Year
Registriert
Mai 2013
Beiträge
43
Hallo!

Ich hab gerade folgendes Problem, ich versuche eine .csv Datei Zeilenweise in einem Vector zu speichern. Das klappt auch soweit aber nach dem die letzte Zeile, der Datei eingelesen wurde, bricht Visualstudio das Kompilieren ab mit folgender Meldung: "Expression:invalid null pointer". Ich denke mal das liegt daran das mein Program versucht eine nicht exestierende Zeile in den Vector zu schreiben, was wieder rum an meiner abbruch bedinung liegen müsste. Aber leider komm ich nicht drauf wie ich genau das verhindern kann. Ich wäre euch sehr dankbar wenn mir jemand erklärt wie ich das verhindern kann.

Hier ist mein Code:
Code:
public : string Einlesen()
{ 
    // Datei oeffnen  
    ifstream csvread;
    csvread.open("testdatei.csv", ios::in);
   
    if (csvread.is_open() !=true) 
	{
                cerr << "Datei konnte nicht geöffnet werden" << endl;
                csvread.close();
    }
	else
	{   
		// Datei zeilenweise auslesen und in Array speichern
		vector<string> lines;
		string line;
			while(!csvread.eof()){
				getline(csvread, line);
			        
				lines.push_back(line);  
			}
		csvread.close();
		//textBox1->Text = lines[0];    
	
	}
       return 0;
}
 
Mollfred schrieb:
Ich hab gerade folgendes Problem, ich versuche eine .csv Datei Zeilenweise in einem Vector zu speichern. Das klappt auch soweit aber nach dem die letzte Zeile, der Datei eingelesen wurde, bricht Visualstudio das Kompilieren ab mit folgender Meldung: "Expression:invalid null pointer".

Du weißt schon, was "Kompilieren" bedeutet, oder? Kompilieren (plus Linken) ist das Erstellen eines ausführbaren Programms aus deinem Quellcode. Visual Studio bricht nicht das Kompilieren sondern das Ausführen deines Programms ab. Um rauszufinden, wo genau das passiert, führe das Programm bitte im Debugmodus aus. Wenn der Fehler auftritt, wird das Programm an der Stelle angehalten, an der der Fehler auftrat. Dann kannst du in aller Ruhe die Werte der Variablen untersuchen, bzw. dir den Callstack anschauen und so die Ursache des Fehlers finden.
Ergänzung ()

Und ich vermute mal stark, dein Programm geht flöten, weil deine Einlesen()-Methode ein string-Objekt zurückgeben sollte. Du gibst aber am Ende der Methode mit

return 0;

den Integerwert 0 zurück. Das wird dann implizit in einen Nullpointer umgewandelt, da std::string einen Konstruktor für const char* besitzt, der allerdings nicht mit einem Nullpointer umgehen kann.
 
hey danke für dein Tipp und richtig ich meinte das es beim Debugen abbricht, ist wohl zu spät für meine Konzentration.
Es lag wirklich an dem return 0 hab es geändert und es funktioniert jetzt.
Ergänzung ()

Wenn jetzt der oben genannte Code in Form1 ist, wie kann ich aus Form2 auf den Vector Lines zugreifen? Ich probier das schon seit paar Stunden auch google konnte mir nicht weiter helfen.
 
Vielleicht solltest du dich mal in die Grundlagen der objektorientierten Programmierung einlesen? Das wäre in dem Bereich sehr empfehlenwert. :)
Ich würde ein Objekt zur Datenhaltung empfehlen, die beiden Forms bekannt ist. So lange dein Vector mit den Zeilen eine lokale Variable ist, wird es schwierig von außen drauf zuzugreifen.
 
ja stimmt die Grundlagen muss ich wirklich mal aufarbeiten. Ich hab jetzt meinen Vector direkt im Namensspace deklariert in dem ja auch die Form zwei ist trotzdem kann ich nicht daruf zugreifen....
 
Mollfred schrieb:
Ergänzung ()

Wenn jetzt der oben genannte Code in Form1 ist, wie kann ich aus Form2 auf den Vector Lines zugreifen? Ich probier das schon seit paar Stunden auch google konnte mir nicht weiter helfen.

Da gibt es diverse Möglichkeiten. Eine, die ich empfehlen würde, ist es, den vector in eine der zwei Forms zu stecken ... also ihn entweder zu einer Membervariable einer der 2 Forms zu machen oder ihn als lokale Variable in der Membermethode, die Zugriff auf ihn braucht, zu deklarieren (so weit er nur in dieser Methode benötigt wird). Dann könntest du eine Referenz auf diesen vector an deine Einlesen()-Methode übergeben.

Grobes Schema, keine Garantie auf syntaktische Korrektheit:

Code:
class FirstForm
{
public:
	FirstForm( SecondForm& refToSecondForm ) : m_refToSecondForm( refToSecondForm )
	{
		// ...
	}
	
	void methodThatDeclaresVectorLocally()
	{
		std::vector< std::string > myVector;
		
		// ...
		
		const std::string rueckgabeWert = m_refToSecondForm.Einlesen( myVector );
		
		// Inhalt ist nun in myVector ... kann nun hier weiterverwendet werden.
		
		// ...
	}

private:
	SecondForm& m_refToSecondForm;


};

class SecondForm
{
	std::string Einlesen( std::vector< std::string >& storeHere )
	{
	
		// Inhalt der Datei in vector einlesen.
		
		// ...
	}
};
 
Zurück
Oben