Inhalt umwandeln



  • winux schrieb:

    Fehler Nummer 1:

    while (istr) // der Text wird eingelesen und dann der Inhalt ausgegeben  
    	{    // aber die zweite Zeile wird zweimal ausgegeben 
    		getline(istr,name2);
    		{
    			txt.push_back(name2);
    		}
    		cout << name2 << endl; // nur zum testen der Ausgabe 
    	}
    

    Ganz klare Sache: istr liefert erst false, nachdem das getline am Ende der Datei fehlgeschlagen ist. Sprich:
    - du liest die letzte Zeile ein und gibst sie aus. Alles ok.
    - istr liefert noch true, du betrittst also wieder die Schleife
    - du versuchst, noch eine Zeile zu lesen, was fehlschlägt. in name2 steht noch die alte (letzte) Zeile
    - du gibst sie aus. (zum zweite Mal)
    - istr liefert false, also wird die schleife nicht nochmal betreten.

    Lösung: packe das getline in den while-Kopf. (getline liefert den stream zurück)

    winux schrieb:

    Zweiter Fehler:

    cout << "Geben Sie bitte den Namen der Ausgabedatei ein:";
    	string name3;
    	cin>>name3;
    	ofstream ostr(name.c_str(),ios_base::out);
    	if(!ostr) cout << "Fehler beim Oeffnen der Ausgabedatei" << name3 << endl; 
    
    	ostr << tolower; // hier ist der Fehler
    // Fehler	2	error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen 
    //Operanden vom Typ 'overloaded-function' akzeptiert (oder keine geeignete Konvertierung möglich)
    

    Der Fehler ist vermutlich eher 2 Zeilen davor. ostr << tolower ist Blödsinn. Was willst du damit erreichen? Du übergibst die Funktion an den operator<<. Willst du nicht vielmehr das Ergebnis übergeben?



  • Die tolower habe ich von Buch aus abgeschrieben

    Die tolower aus dem Buch:

    void tolower(string& s)
    {
       for (int i = 0;i<s.length();++i) s[i] = tolower(s[i]);
    }
    

    Und dann wurden zwei Parameter übergeben, ob das richtig ist weiß ich nicht.

    Genau ich will das Ergebnis in die neue Textdatei geschrieben werden soll.



  • Dann hast du's falsch abgeschrieben. Den zweiten Parameter verwendest du nicht, brauchst also auch nicht. Wenn ich mir die letzte Version der Funktion anschaue... erzeugt sie nicht eine Rekursion? Schön find ich sie irgendwie nicht.



  • Eine neuen Fehler wurde entdeckt, wenn man aus der Textdatei ließt dann wird der Inhalt gelöscht.

    Und tolower habe ich überarbeitet:

    string tolower(const vector <string>& txt)
    {
    	string s;
    	for (int i = 0;i<s.length();++i) s[i]= tolower(s[i]);
    	return s;
    }
    

    Und der Aufruf der Funtion:

    ostr << tolower(txt);
    

    Die neue einlese:

    while (getline(istr,name2)) 
        { 
    	   if (! istr || istr.fail() || istr.bad())
    	   {
    		   cout << "Fehler beim Einlesen\n";
    	   }
    	   else
    	   {
           txt.push_back(name2); 
    	   cout << name2 << endl;
    	   }
        }
    

  • Mod

    Zum Einlesen:
    1. Wie kommst du da drauf, dass es das Einlesen ist, welches den Inhalt löscht?
    2. Dein Code zeigt: Du kannst (falsch) abschreiben, aber du hast nichts verstanden 😞 .



  • Also nach dem einlesen aus der Textdatei wird der Inhalt in der Datei gelöscht. Die Textdatei war vor dem einlesen 39 Byte groß und nach dem einlesen ist es 0 Byte groß.
    Die tolower Funktion von den ich abgeschrieben habe war selbst definiert, meine nicht ich habe sie geschreieben sondern der Autor der Buches.


  • Mod

    winux schrieb:

    Also nach dem einlesen aus der Textdatei wird der Inhalt in der Datei gelöscht. Die Textdatei war vor dem einlesen 39 Byte groß und nach dem einlesen ist es 0 Byte groß.

    Du folgerst bestimmt falsch. Du müsstest das Einlesen dafür nämlich einzeln getestet haben und irgendwie traue ich dir nicht zu, dass du das getan hast.

    Die tolower Funktion von den ich abgeschrieben habe war selbst definiert, meine nicht ich habe sie geschreieben sondern der Autor der Buches.

    Ich rede davon, was du bezüglich des Einlesens von mir und pumuckl abgeschrieben hast.



  • @winux: Code aus irgendwelchen Stellen im Netz zusammenzukopieren ist sinnfrei. Nimm dir bitte ein Anfängerbuch und lerne die Sprache. Sonst wirst du nie verstehen, was dein Code wirklich macht, und vor allem wirst du nicht weit kommen. Wenn du wild herumprobierst ist es für uns hier ziemlich müßig, dir jedesmal zu sagen, dass du beim Copy&Paste wieder einen Fehler gemacht hast.



  • Habe eine Code korrektur gemacht, doch der Compiler sagt:
    Fehler 2 error C2664: 'tolower': Konvertierung des Parameters 1 von 'std::string' in 'int' nicht möglich

    ifstream istr("Name.txt",ios_base::in);
    	if(!istr) cout << "Fehler beim Oeffnen der Eingabedatei" << endl;
    	vector <string> txt;
    	string name;
    
    	while (getline(istr,name)) 
        { 
    	   if (! istr || istr.fail() || istr.bad())
    	   {
    		   cout << "Fehler beim Einlesen\n";
    	   }
    	   else
    	   {
           txt.push_back(name); 
    	   }
        } 
    
    	ofstream ostr("Name2.txt",ios_base::out);
    	if(!ostr) cout << "Fehler beim Oeffnen der Ausgabedatei" << endl; 
    
    	for (int i = 0;i<txt.size();++i)
    	{
    	txt[i] = tolower(txt[i]);  // und hier ist der Fehler
    	ostr << txt[i] << endl;
    	cout << txt[i] << endl;
    	}
    
    	keep_window_open();
        return 0;
    

  • Mod

    Satz 1: Du sollst nicht C und C++ mischen, ohne genau zu wissen, was du dort tust.

    Korollar: Du sollst nicht einfach Sachen aus dem Netz zusammenklicken.

    Satz 2: Wenn man nicht weiß, was eine Funktion genau macht und wie sie deklariert ist, guckt man in eine Referenz und schlägt diese nach.

    edit: Falls du verwirrt bist: Du hast nicht deine eigene to_lower Funktion benutzt, sondern die aus der Standardbibliothek, die einen int erwartet. Deine eigene to_lower-Funktion hat eine andere Signatur.



  • Habe nichts aus dem netz zusammengeklickt. Die Code beispiele sind aus dem Buch von dem ich C++ lernen, oder besser gesagt Herr Stroustrup hat sie geschrieben.


  • Mod

    winux schrieb:

    Habe nichts aus dem netz zusammengeklickt. Die Code beispiele sind aus dem Buch von dem ich C++ lernen, oder besser gesagt Herr Stroustrup hat sie geschrieben.

    Ich habe dir oben noch was reineditiert, was dir auch beim konkreten Problem helfen sollte.



  • Dann muss halt eine eigene tolower Funktion her.

    EDIT:
    Nach langem hin und her habe ich es danke eure Hilfe und Tipps geschafft. Endlich Funktioniert alles so wie es soll.

    string tolower(string& s)
    {
    	for (int i = 0;i<s.size();++i) s[i] = tolower(s[i]);
    	return s;
    }
    
    int main()
    {
    	ifstream istr("Name.txt",ios_base::in);
    	if(!istr) cout << "Fehler beim Oeffnen der Eingabedatei" << endl;
    	vector <string> txt;
    	string name;
    
    	while (getline(istr,name)) 
        { 
    	   if (! istr || istr.fail() || istr.bad())
    	   {
    		   cout << "Fehler beim Einlesen\n";
    	   }
    	   else
    	   {
           txt.push_back(name); 
    	   }
        } 
    
    	ofstream ostr("Name2.txt",ios_base::out);
    	if(!ostr) cout << "Fehler beim Oeffnen der Ausgabedatei" << endl; 
    
    	for (int i = 0;i<txt.size();++i){
    	tolower(txt[i]);
    	ostr << tolower(txt[i]) << endl;}
    
    	keep_window_open();
        return 0;
    }
    

    Die Textdatei:

    Wie Geplant Trafen
    Die Gaeste Ein Dann
    

    Und dann korrekte die Ausgabe:

    wie geplant trafen
    die gaeste ein dann
    

  • Mod

    Das sieht sogar fast gut aus. Ein paar Kommentare:
    **
    Wichtig:**

    Deine tolower-Funktion verändert das Original und gibt dann nochmals eine Kopie zurück. Entweder ändere das Original und gib nichts zurück oder mach eine Kopie, ändere diese und gib diese zurück. Nicht beides.

    Die Ausgabe für die falsche Eingabe kann niemals erreicht werden, denn wenn beim Einlesen eines der Fehlerflags gesetzt wird, dann bricht die while-Schleife bereits ab. Du könntest, wenn du möchtest, aber nach der while-Schleife testen, ob der Abbruch durch das Dateiende (also normal) oder durch etwas anderes (Fehler) verursacht wurde. Aber abgesehen von einem echten Festplattenfehler kann an der Stelle eigentlich nichts passieren.

    Kleinigkeiten:

    Das ios_base::out in Zeile 26 kannst du dir sparen, das ist bereits der Standardparameter für den ofstream. Ebenso in Zeile 9.

    Deine Bedingung in Zeile 16 ist, selbst wenn sie überhaupt erreicht würde, redundant. denn durch das !istr sind fail und bad bereits eingeschlossen. Und weiterhin schließt fail() auch bereits bad() ein.



  • Danke für den Tipp.


Anmelden zum Antworten