Problem mit datei aus-einlesen



  • Hallo Community C++

    Ich habe zurzeit ein Problem und finde keine Lösung, von daher bitte ich euch um mir ein Hinweis zu geben.

    Es geht hierbei um datei einlesen, auslesen und bearbeiten.

    hier ist mal mein code

    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
      int main()
      {
    		// es geht darum, wenn die eingegebene zahl kleiner als das was im datei_1.txt ist, wird diese ersetzt.
    		//z.B eingegebene zahl ist 50 und im datei1_txt ist 100 dann soll durch programm die 50 im datei_1.txt stehen. 
    
    		string zahl;
    		cout<<"zahl eingeben"<<endl;
    		getline(cin,zahl);			// zahl eingeben : 50
    		string text,a;
    		ifstream read("datei_1.txt",ios_base::in);		// wert im datei_1 lesen und in text lagern.
    		getline(read,text,'\0');		// im datei_1 befindet 100
    		read.close();		// schließen
    
    		ofstream write ("datei_1.txt",ios_base::out);		// schreiben im fall
    		if(text>zahl || text == "")		// <---- Hier liegt der fehler (obwohl 100 > 50.)
    		{
    		text.swap(zahl);
    		write<<text<<endl;
    		write.close();
    		}
    		if( text < zahl)		// im fall wenn zahl größer als text, wird text nicht geändert.
    		{
    		write<<text<<endl;
    		write.close();
    
    	  }
    
    	system("pause");
        return 0;
      }
    

    Also durch debuggen wurde ich auch nicht schlauer...
    Zeile 23 wird übersprungen und komischeweise wird zeile 29 nicht übersprungen.

    Nun lasse ich mal die pros dran 😃
    Übrigens Anfänger also bitte so erklären dass man es noch versteht ^^

    Vielen Dank



  • http://www.cplusplus.com/reference/string/string/operators/
    Der > operator bei std::strings guckt nicht ob da eine Zahl drin ist und vergleicht beide. Du musst beide strings in eine Zahl umwandeln (z.b http://www.cplusplus.com/reference/string/stoi/) und dann vergleichen.



  • vielen dank für die info.
    macht sinn^^

    😃



  • Hallo yeurandom,

    das wichtigste, was man wohl zu Deinem Code anmerken sollte, ist, dass man zum Lesen und Schreiben nicht getline sondern sogenannte extraction und insertion operators benutzt. Was sich vielleicht etwas hochtrabend anhört ist nichts anderes als der >>- bzw- <<-Operator (siehe http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/ und http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/).

    Ich habe Dein Problem mal dahin gehend umgeschrieben und eine Fehlerbehandlung hinzugefügt:

    #include <iostream>
    #include <fstream>
    
    int main()
    {
        using namespace std;
    
        int eingegebene_zahl;
        cout << "Bitte Zahl eingeben> ";
        if( cin >> eingegebene_zahl )   // Hier wird eine (Integer-)Zahl vom Eingabestream gelesen
        {
            const char* datei_name = "datei_1.txt";
            ifstream read(datei_name);  // ohne ios_base::in; es ist doch schon ein (I)fstream
            if( !read.is_open() )       // beim Lesen immer prüfen, ob die Datei auch vorhanden bzw. offen ist.
            {
                cerr << "Fehler beim Oeffnen von " << datei_name << endl;
                return 0;   // exit
            }
            int zahl_in_datei_1;
            if( read >> zahl_in_datei_1 )   // auch hier wird nur eine Zahl gelesen; alles andere ist ein Fehler (s.u.)
            {
                if( eingegebene_zahl < zahl_in_datei_1 ) // Zitat: "es geht darum, wenn die eingegebene zahl kleiner als das was im datei_1.txt ist, wird diese ersetzt"
                {
                    read.close();   // nur hier ist ein 'close' notwendig; in den anderen Fällen schließt die Datei beim Verlassen des Scopes
                    ofstream write(datei_name);
                    write << eingegebene_zahl; // genau wie beim Lesen, kann man eine Zahl auch schreiben
                    if( write.fail() )
                        cerr << "Fehler beim Schreiben von " << eingegebene_zahl << endl;
                }  // hier wird 'write' automatisch geschlossen, da die Variable 'write' außerhalb dieses Scopes nicht mehr definiert wird (Destrukor ~ofstream)
            }
            else
                cerr << "Fehler beim Lesen der Zahl aus " << datei_name << endl;
        }
        else
            cerr << "Eingabe war keine Zahl" << endl;
        return 0;
    }
    

    yeurandom schrieb:

    Übrigens Anfänger also bitte so erklären dass man es noch versteht ^^

    .. schwierig, wenn man nicht weiß, wo mann aufsetzen kann. Besser Du stellst möglichst konkrete Fragen.

    Gruß
    Werner


Log in to reply