[C++] Datei auslesen und in Vector speichern *erledigt*

dabu

Well-known member
ID: 11566
L
20 April 2006
7.229
407
Ich habe folgenden Vector:

vector<CString> MyVector;

In diesem Vector will ich die Zeilen aus einer Datei speichern. Den Inhalt der Datei hole ich hiermit:

PHP:
GetDlgItemText(IDC_EDT_FILENAME, strDateiname);

	if( false == strDateiname.IsEmpty() )
	{
		ifstream file_in;
		file_in.open(strDateiname, ios::in);
		if( file_in.good() ) 
		{
			file_in.seekg(0L, ios::beg); 	
			while( !file_in.eof() )
			{
			          MyVector.push_back();		                          
            }
		}
		file_in.close();
	}

So weit so gut. Mein Problem ist aber, dass ich dem Vector durch push_back den Zeileninhalt nicht übergeben kann, weil der dann Fehlermeldungen wegen CString auswirft (hab einiges versucht, aber alles ohne Erfolg). Wie mach ich das denn jetzt, dass ich den Zeileninhalt in diesem Vector speichern kann?
 

burnred

Powerhamster
ID: 34739
L
4 Mai 2006
684
40
Schon mal probiert deinen eingelesenen Inhalt einfach auf CString zu casten bevor du ihn dem vector anhängen willst? Zumal seh ich anhand von dem Quelltext nicht das du überhaupt versuchst dem vector was hinzuzufügen.
 

dabu

Well-known member
ID: 11566
L
20 April 2006
7.229
407
Schon mal probiert deinen eingelesenen Inhalt einfach auf CString zu casten bevor du ihn dem vector anhängen willst? Zumal seh ich anhand von dem Quelltext nicht das du überhaupt versuchst dem vector was hinzuzufügen.

Ja, einen Cast habe ich bereits versucht, aber das hatte nichts gebracht. Und ja, im Quelltext oben wird nichts übergeben, weil das eben nicht funktioniert hatte. Deswegen habe ich die Übergabe enfernt, was ja nur 2 Zeilen mehr wären.

Eventuell hatte ich den Cast auch falsch gemacht, was ich mir aber eigentlich nicht vorstellen kann, weil ich wirklich sehr viele verschiedene Dinge getestet habe. Statt CString habe ich kurze Zeit mal nur String getestet. Da gings komischerweise... aber ich brauch eben CString :(.
 

dabu

Well-known member
ID: 11566
L
20 April 2006
7.229
407
Ah, ich habs gefunden. Ist doch einfacher, als gedacht :biggrin:.

Wenn man einen String hat, aber einen CString braucht, dann kann man das so machen:

string MeinString;
MeinString = "irgendwas halt";

Wenn ich das dann im CString-Vector ablegen will:
MyVector.push_back( MeinString.c_str() );

Und dafür habe ich jetzt ewig gebraucht, obwohl es eigentlich so einfach gewesen wäre :oops: :mrgreen:.
Hauptsache jetzt klappts :).
 

dubberle

Oben bleiben!
ID: 291199
L
18 Juli 2007
1.619
336
Ich würde da noch ein paar Sachen verschönern:

PHP:
const unsigned int max_length_of_line = 4096; // oder ein anderer Wert
vector<CString> MyVector;
CString strDateiname;

//...

if( !strDateiname.IsEmpty() )
{
	ifstream file_in(strDateiname);
	char line[max_length_of_line];

	while( file_in.good() && !file_in.eof() )	
	{
		file_in.getline(line, max_length_of_line);
		MyVector.push_back(CString(line));
	}
	// file_in.close();
}

Das false == ist einfach unschön.
Du verwendest einen ifstream. Da kannst Du den Dateinamen als Parameter des Konstruktors angeben und - wenn Du magst - den Openmode gleich dazu. Der ist aber per derfault beim ifstream ohnehin ios::in, also mußt Du den nicht extra angeben. In militärischen Anwendungen müßtest Du das aber aus "Sicherheitsgründen" doch tun :ugly:
Den seek kannst Du Dir auch sparen. Der ifstream öffnet die Datei immer am Anfang. Damit würde die whileschleife als einziger Block innerhalb der if-Abfrage erfolgen. Du kannst beide aber getrost zusammenschmeißen. Dabei geht etwas Performanz flöten, aber dafür wird der Code übersichtlicher.
Das file_in.close() ist strenggenommen auch unnötig. file_in wird auf dem Stack erzeugt und beim Verlassen des Blocks sofort wieder zerstört - dabei wird der Dateistrom aber implizit wieder geschlossen. Dennoch würde ich das dort lassen, denn wenn man das Codefragment mal irgendwohin kopiert, wo file_in nicht zerstört wird, dann vergißt man nicht die Datei zu schließen.
 

dabu

Well-known member
ID: 11566
L
20 April 2006
7.229
407
Das false == ist einfach unschön.

Ich weiß. Da bin ich aber an Vorgaben gebunden. Das ist im kompletten Programm auch so und ich muss dieses erweitern. Deswegen muss ich das so übernehmen :(.

Aber danke für die anderen Sachen. Hab ich wieder eine Kleinigkeit dazu gelernt :).
 

dubberle

Oben bleiben!
ID: 291199
L
18 Juli 2007
1.619
336
Heißt das, daß Du dann auch
PHP:
while(false == file_in.eof())
schreiben mußt? 8O

Da möchte ich aber an der Kompetenz dessen, der sowas festlegt, zweifeln. Einmal nicht recht auf die Taste gekommen und statt == nur = geschrieben... An solchen Fehlern sucht man mitunter tagelang *aus Erfahrung sprech*.

Es freut mich, wenn ich mein Wissen mit Dir teilen durfte :)
 

dubberle

Oben bleiben!
ID: 291199
L
18 Juli 2007
1.619
336
Da fröstelts mich ja... Dann hast Du im ersten Post aus Gewohnheit den Not-Operator genutzt... Ich glaube, ich würde kündigen.
 

dabu

Well-known member
ID: 11566
L
20 April 2006
7.229
407
Ich glaube, ich würde kündigen.

Das hat alles einen anderen Zusammenhang: Ich mache derzeit ein Praktikum. Und meine Aufgabe ist es ein Programm einer anderen Firma zu erweitern. Und dafür sollte ich mich möglichst an die bereits verwendete Struktur halten. Kündigen würde da also nur wenig Sinn machen ;).