Text aus Datei auslesen, ändern, wieder einlesen

shakar

Grünschnabel
Hi, bin nach dem ich mal fleissig Tutorials durchgearbeitet hab, jetzt dabei nen kleines Programm zu schreiben, das den Text einer Datei einliest, bestimmte Zeichen dann umwandelt und anschliesend wieder einliest. Hab auch schon diverse Threads hier durchgelesen, die mir auch soweit geholfen haben, aber jetzt habe ich trotzdem 2 Fragen. Hier erstmal der aktuelle Code:
C++:
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

void konvertieren(char dateiName[30])
{
	// Datei öffnen
	ifstream iStream(dateiName);
	ofstream oStream(dateiName);
	cout << "iStream: " << iStream << " oStream: " << oStream << endl; 	// Kontrolle
	
	string aktuelleZeile;
	
	while( getline(iStream, aktuelleZeile) )
	{
		cout << "aktuelleZeile (Anfang von Schleife): " << aktuelleZeile << endl; // Kontrolle
		while(aktuelleZeile.find("&lt;",0)<300)	aktuelleZeile.replace(aktuelleZeile.find("&lt;",0),4,"<");
		cout << "aktuelleZeile (Ende von Schleife): " << aktuelleZeile << endl; // Kontrolle
		cout << "iStream (Schleife): " << iStream << " oStream (Schleife): " << oStream << endl; 	// Kontrolle
		oStream << aktuelleZeile << endl;
	}
	
	iStream.close();
	oStream.close();
}

void main()
{
	konvertieren("test.txt");
}

Leider funktioniert das nur wenn ich für oStream eine zweite Textdatei nehme, mit der gleichen ist es nicht möglich. Das wäre mal meine erste Frage wie man das mit den gegebenen Mitteln machen kann oder ob ich da nen ganz anderen ansatz benötige (wenn ja, nur die richtung angeben, den weg will ich selber suchen).
Zweite Frage wäre wie arbeitet die Zeile:
C++:
while( getline(iStream, aktuelleZeile) )
Was gibt getline denn zurück und verstehe ich das richtig, in dieser while abfrage wird auch die Variable aktuelleZeile gefüllt?
mfg

Edit: Konnte es selber lösen, wobei mir hiers Board geholfen hat:
C++:
#include <string>
#include <fstream>
#include <iostream>
using namespace std;

void konvertieren(char dateiName[30])
{
	ifstream iStream(dateiName);		// Datei öffnen
	ofstream tempStream("temp.txt");	// tempomäre Datei erstellen und öffnen

	string aktuelleZeile;

	while( getline(iStream, aktuelleZeile) )	// ?, vermutlich die Zeile in string laden und wiederholen bis zum ende der Datei
	{
		while(aktuelleZeile.find("&lt;",0)<300)		aktuelleZeile.replace(aktuelleZeile.find("&lt;",0),4,"<");		// wiederholen bis Ende von Zeile ("find" gibt dann riesige Zahl aus) und suchzeichen ersetzen.
		while(aktuelleZeile.find("&quot;",0)<300)	aktuelleZeile.replace(aktuelleZeile.find("&quot;",0),6,"\"");	// wiederholen bis Ende von Zeile ("find" gibt dann riesige Zahl aus) und suchzeichen ersetzen.
		while(aktuelleZeile.find("&gt;",0)<300)		aktuelleZeile.replace(aktuelleZeile.find("&gt;",0),4,">");		// wiederholen bis Ende von Zeile ("find" gibt dann riesige Zahl aus) und suchzeichen ersetzen.
		while(aktuelleZeile.find("&amp;",0)<300)		aktuelleZeile.replace(aktuelleZeile.find("&amp;",0),5,"&");	// wiederholen bis Ende von Zeile ("find" gibt dann riesige Zahl aus) und suchzeichen ersetzen.
		tempStream << aktuelleZeile << endl;		// in tempomäre Datei schreiben
	}

	iStream.close();
	tempStream.close();
	
	remove(dateiName);		// Original Datei löschen
	rename("temp.txt", dateiName);		// tempomäre Datei umbenennen
	
}

void main()
{
	konvertieren("test.txt");
}

Ich lass erst in eine tempomäre Datei schreiben, lösche das original und benenne die Temp um.

Wenn mir jedoch jemand die Frage zur while-Bedingung beantworten würde, wäre mir trotzdem für die Zukunft geholfen.
 
Zuletzt bearbeitet von einem Moderator:
Hi.

Laut C++ Standard (und auch C Standard) muss die main Funktion int zurückgeben.

Dann liefert die std::string::find Methode tatsächlich eine große Zahl wenn der gesuchte Substring nicht gefunden wurde, aber nicht irgendeine sondern std::string::npos. Du solltest besser auf Gleichheit mit diesem Wert prüfen - schließlich kann es auch sein, dass die Zeile größer als 300 Zeichen ist. Siehe z.B. http://www.cplusplus.com/reference/string/string/find.html

Die Funktion getline liefert das Input-Stream Objekt zurück welches als erster Parameter übergeben wurde. Die eingelesene Zeile wird tatsächlich in dem String der als zweiter Parameter übergeben wird gespeichert - jedenfalls wenn kein Fehler auftritt. Dann wird nämlich nur der Fehlerzustand im Stream verändert. Siehe http://www.cplusplus.com/reference/string/getline.html

Gruß
 
Das mit den 300 Zeichen ist zum glück tatsächlich das maximale Limit das bei meinen Dateien auftauchen kann, aber danke für den Hinweis dann weiss ich bescheid für zukünftige Programme. Bei void main() bin ich wohl von Volkardskurs vorgeschädigt, fiel mir aber auch schon auf das das nirgends sonst erscheint, werde ich auch in Zukunft beachten.
 
Zurück