C++ Textdatei einlesen und umwandeln

AirForce

Lt. Junior Grade
Registriert
Okt. 2010
Beiträge
296
Schreibe ein Programm das aus eine Textdatei einliest, den Inhalt in Kleinbuchstaben umwandelt und das Ergebnis in einer neuen Datei speichert. Doch der Compiler sagt mir das bei tolower die Lokale Funktionsdefinition ist unzulässing.

Das Programm:
Code:
void Txt_read()
{
	cout << "Geben Sie bitte den Namen der Eingabedatei ein:";
	string name;
	cin>>name;
	ifstream istr(name.c_str());
	if(!istr) cerr << "Fehler beim Oeffnen der Eingabedatei" << name << endl;
	vector <string> txt;
	string name2;

	while(istr)
	{
		getline(cin,name2);
		txt.push_back(name2);
	}
	istr.close();

	ofstream fout( "Name2.txt" ); 
	cout << "Geben Sie bitte den Namen der Ausgabedatei ein:";
	cin>>name;
	ofstream ostr(name.c_str());
	if(!ostr) cerr << "Fehler beim Oeffnen der Ausgabedatei" << name << endl; 
	
	void tolower(const vector <string>& txt,string& s)
	{
        for (int i = 0; i< txt.length(); ++i) s[i] = tolower(s[i]); 
	}

	fout << tolower << endl;
	cout << tolower << endl;
}

int main()
{
    Txt_read();

    keep_window_open();
    return 0;
}

Die Inhalt der Textdatei:
Code:
Wie Geplant Trafen
Die Gaeste Ein Dann
 
Zuletzt bearbeitet:
Hi,

probier mal bei der for schleife in der Tolower funktion es mit i++ und nicht mit ++i

mfg
 
AirForce schrieb:
Schreibe ein Programm das aus eine Textdatei einliest, den Inhalt in Kleinbuchstaben umwandelt und das Ergebnis in einer neuen Datei speichert. Doch der Compiler sagt mir das bei tolower die Lokale Funktionsdefinition ist unzulässing.[...]

Zieh die Definition deiner tolower() Funktion eben aus der Txt_read()-Funktion raus. Außerdem wäre es vielleicht gut, deiner eigenen tolower-Funktion einen anderen Namen zu geben als die Standard-C tolower()-Funktion.

Und was willst du eigentlich hiermit erreichen:

Code:
fout << tolower << endl;
cout << tolower << endl;
Ergänzung ()

havOcjam schrieb:
Hi,

probier mal bei der for schleife in der Tolower funktion es mit i++ und nicht mit ++i

mfg

Bitte nicht einfach per Zufallsverfahren rumstochern und auf einen Glückstreffer hoffen. ++i ist die bessere Variante, hat aber mit dem Problem an und für sich erst mal überhaupt nichts zu tun.
 
Zuletzt bearbeitet:
@havOcjam
Geht auch nicht, jetzt da der Vektor Inhalt auch übergeben wird sagt der Compiler das length ist kein Element von Vektor.
 
Und noch etwas. In C++ ist es möglich, eine Textdatei viel einfacher in einen std::string einzulesen.

Code:
std::ifstream ifs( "MeineDatei.txt", std::ios::in );

if ( ! ifs || ifs.fail() || ifs.bad() )
{
    // hat ned geklappt ... Fehlerbehandlung
    // ...
}

const std::string fileContent( ( std::istreambuf_iterator< char >( ifs ) ), std::istreambuf_iterator< char >() );
Ergänzung ()

AirForce schrieb:
@havOcjam
Geht auch nicht, jetzt da der Vektor Inhalt auch übergeben wird sagt der Compiler das length ist kein Element von Vektor.


Ist es auch nicht. size(), gibt dir die Größe des Vectors. Nur bei std::string gibt es sowohl size() als auch length() (tun genau das gleiche).
Und wo wir schon dabei sind, std::vector::size() liefert einen std::size_t, keinen int!
 
Zuletzt bearbeitet:
Das Programm wurde geändert:

Code:
void Txt_read()
{
	ifstream ifs( "Name.txt", std::ios::in );
	vector <string> txt;
	string name2;
	if ( ! ifs || ifs.fail() || ifs.bad() )
       {
		cerr << "Fehler beim Oeffnen der Eingabedatei" << name << endl; 
       }
       else 
       {
		getline(cin,name2);
		txt.push_back(name2);
	}
	ifs.close();
}
	
void write_in(vector <string>& txt, string& s)
{
	for (int i = 0; i < txt.size(); ++i) s[i] = write_in(s[i]);
}

void Write_txt()
{
	ofstream fout( "Name2.txt" ); 
	cout << "Geben Sie bitte den Namen der Ausgabedatei ein:";
	string name;
	cin>>name;
	ofstream ostr(name.c_str());
	if(!ostr) cerr << "Fehler beim Oeffnen der Ausgabedatei" <<  endl; 

        fout << wriet_in << endl; // soll das Ergebnis in die neue Datei schreiben 
}

int main()
{
    Txt_read();
    Write_txt();

    keep_window_open();
    return 0;
}

Der Compiler sagt write_in Funktion akzeptiert nur 1 Argument,
 
Zuletzt bearbeitet:
Code:
void write_in([COLOR="Red"]const[/COLOR] vector <string>& txt, string& s)
{
	for ([COLOR="Red"]std::size_t[/COLOR] i = 0; i < txt.size(); ++i) s[i] = [COLOR="Red"]tolower[/COLOR](s[i]);
}

Moment mal, jetzt sehe ich das erst mal. Warum nimmst du die Größe des vectors her, um die Anzahl der Iterationen über deinen string zu bestimmen? Ist das nicht irgendwie komisch?
Ergänzung ()

Code:
#include <fstream>
#include <iostream>
#include <string>

namespace
{
	const std::string readFile( const std::string& filePath )
	{
		std::ifstream ifs( filePath.c_str(), std::ios::in );

		if ( ! ifs || ifs.fail() || ifs.bad() )
		{
			std::cerr << "Fehler beim Oeffnen der Eingabedatei" << filePath << std::endl;
			return std::string();
		}

		return std::string( ( std::istreambuf_iterator< char >( ifs ) ), std::istreambuf_iterator< char >() );
	}
}

int main()
{
	std::string content = readFile( "Name.txt" );

	if ( ! content.empty() )
	{
		std::cout << "Content of file: \"" << content << "\".\n";
	}
	
	for ( std::string::iterator it = content.begin(); it != content.end(); ++it )
	{
		*it = tolower( *it );
	}
	
	std::ofstream ofs( "Name2.txt", std::ios::out );
	ofs << content;
}

Probier das mal.
 
Zuletzt bearbeitet:
Gut alles ist OK. Dein Code Funktioniert. Danke für deine Hilfe.
Aber jetzt eine andere Sache, gibt es auch eine Lösung für den Code den ich angefangen habe?

Code:
void Txt_read()
{
	cout << "Geben Sie bitte den Namen der Eingabedatei ein:";
	string name;
	cin>>name;
	ifstream istr(name.c_str() ,ios_base::in);
	if(!istr) cerr << "Fehler beim Oeffnen der Eingabedatei" << endl;
	vector <string> txt;
	string name2;

        while (istr.getline(cin,name2))  // hier ist der Fehler
	{
		txt.push_back(name2);
		cout << name2 << endl;
	}
    
	istr.close();
}

void write_in(const vector <string>& txt, string& s)
{
	for ( int i = 0; i < txt.size(); ++i) s[i] = tolower(s[i]);
}

void Write_txt()
{
	cout << "Geben Sie bitte den Namen der Ausgabedatei ein:";
	string name;
	cin>>name;
	ofstream ostr(name.c_str(),ios_base::out);
	if(!ostr) cerr << "Fehler beim Oeffnen der Ausgabedatei" << name << endl; 

	ostr << write_in;
	cout << write_in << "\n";
}

int main()
{
    Txt_read();
    Write_txt();

    keep_window_open();
    return 0;
}
 
Zuletzt bearbeitet:
AirForce schrieb:
Gut alles ist OK. Dein Code Funktioniert. Danke für deine Hilfe.
Aber jetzt eine andere Sache, gibt es auch eine Lösung für den Code den ich angefangen habe?

Klar gibt es die, aber ich rate dir dringend, noch mal deinen Code Zeile für Zeile durchzugehen und dich in jeder Zeile selbst zu fragen: "Was möchte ich mit dieser Anweisung erreichen?"

Dann wirst du nämlich (unter anderem) über diesen Abschnitt hier stolpern:

Code:
ostr << write_in;
cout << write_in << "\n";

Ich weiß, was du hier tun möchtest ... aber glaubst du, daß das so funktionieren kann? Was tust du hier? Möchtest du die Funktion write_in in einen Stream schreiben? Sicherlich ist dir klar, daß das keinen Sinn ergibt. Was du wirklich willst, ist die Funktion write_in mit den passenden Argumenten aufzurufen, damit sie jedes Zeichen deines Strings in den entsprechenden Kleinbuchstaben umwandelt. Dann möchtest du den umgewandelten String in den Stream schreiben.

Also setz dich mal hin, atme tief durch und dann setze das um. ;)
Ergänzung ()

Außerdem, wie glaubst du soll deine Write_txt-Funktion an die Daten kommen, die du in Txt_read ermittelt hast?
 
Zuletzt bearbeitet:
Du hast recht, ich will das das Programm die Datein aus der Textdatei liest. Und dann soll es die Wörter umwandeln und es soll dann das in eine andere Datei schreiben. Genau so wie du es sagst.
Denke das Write_Txt die Daten aus einem Vektor bekommt was zuvor mit Txt_read gelesen wurde.
Der Code:
Code:
ostr << write_in;
cout << write_in << "\n";  // ist nur ein Test um zu sehen was in die Datei geschrieben wird
 
antred schrieb:
Code:
if ( ! ifs || ifs.fail() || ifs.bad() )
3-fach hält besser? :)

Code:
!ifs       -> ifs.operator!() -> gibt fail() zurück
ifs.fail() -> true, wenn failbit oder badbit gesetzt sind
ifs.bad()  -> true, wenn badbit gesetzt ist

if( !ifs) tut's auch. :)
 
7H3 N4C3R schrieb:
3-fach hält besser? :)

Code:
!ifs       -> ifs.operator!() -> gibt fail() zurück
ifs.fail() -> true, wenn failbit oder badbit gesetzt sind
ifs.bad()  -> true, wenn badbit gesetzt ist

if( !ifs) tut's auch. :)

Oh ok, da war ich mir ned so sicher. Im Zweifel für den Angeklagten, dachte ich mir. Werd's mir für die Zukunft merken. :D
 
Zurück
Oben