Letze Zeile wird nicht verarbeitet ???



  • Hallo,

    ich lese Zeilenweise aus einer Datei ein und will die Zeile auch weiterverarbeiten. Soweit auch alles kein Problem, lediglich meine letzte Zeile macht ein Prob. Sie wird zwar eingelesen, aber nciht mehr verarbeitet...
    Weiß jemand wo der Fehler ist ?

    #include<iostream>
    #include<fstream>
    #include<string>
    #include<sstream>
    using namespace std;
    
    void ZeileUP(string& InputZeile);
    
    int main ()
    {
        ifstream InputFile_ENV ( "env.txt" );
        ofstream OutputFile ( "protokoll.txt" );
        char* EnvVar = 0;
        string Umgebungsvariable;
        string Inhalt;
        string InputZeile_ENV;
    
        if ( InputFile_ENV.good() && OutputFile.good() )
        {
            getline (InputFile_ENV,InputZeile_ENV);
    
            while (!InputFile_ENV.eof())
            {
                istringstream istrstr_InputZeile_ENV(InputZeile_ENV);
    
                istrstr_InputZeile_ENV >> Umgebungsvariable >> Inhalt;
                EnvVar = getenv ( Umgebungsvariable.c_str() );
    
                if ( EnvVar != 0 )
                {
                    string InputZeile = EnvVar;
    
                    ZeileUP(InputZeile);
    
                    string::size_type pos = InputZeile.find ( Inhalt,0 );
    
                    if ( pos == string::npos )
                    {
                        OutputFile << Umgebungsvariable << " " << Inhalt << " nicht gesetzt " << endl;;
                    }
                }
                else
                {
                    OutputFile << Umgebungsvariable << " " << Inhalt << " nicht gesetzt " << endl;;
                }
                getline(InputFile_ENV,InputZeile_ENV);
            }
        }
        else
        {
            // Fehlerhafte Eingabedatei und Ausgabedatei
        }
    
        return 0;
    }
    
    void ZeileUP(string& InputZeile)
    {
        for ( short i = 0 ; i < InputZeile.length() ; i++ )
        {
            if ( isalpha(InputZeile[i]))
            {
                InputZeile[i] = toupper(InputZeile[i]);
            }
        }
    }
    


  • Vielleicht liegt es daran, dass der String ein Zeiger ist, probiers mal nochmal mit call-by-value, also Wertübergabe.



  • ALso es ist ein ganz komisches Problem. Ich habe festgestellt, dass wenn ich in der Eingabedatei bin und dort in der letzten Zeile RETURN drücke und somit in die nächste Zeile den Cursor platzieren, dann läuft es mit der letzten Zeile.Wenn ich in der letzten Zeile kein RETURN mache also Cursorsposition am Ende der letzten Zeile, dann gehts nicht. Wie kann ich das verbessern ???



  • Hallo,
    dein Programm ist ziemlich wirr und enthält neben bei auch noch ein paar Logikfehler.
    Falls deine Eingabedatei z.B. nur eine Zeile hat, wird diese nicht verarbeitet.

    Sie wird zwar eingelesen, aber nciht mehr verarbeitet...

    Das liegt daran, dass du erst die letzte Zeile liest und dann prüfst ob eof gelesen wurde. Sollte nun deine letzte Zeile *nicht* mit einem Newline-Zeichen enden, dann liest getline bis zum eof, setzt das eof-Bit, der eof-Test ergibt true und die Schleife wird verlassen. Die letzte Zeile wird nicht mehr bearbeitet.

    Hier mal eine in meinen Augen etwas leichterere Implementation, die auch das Problem mit der letzten Zeile nicht haben dürfte:

    #include<iostream>
    #include<fstream>
    #include<string>
    #include <algorithm>
    #include <cctype>
    using namespace std;
    
    void split(const string& source, string& word1, string& word2, char delim = ' ');
    string& toupper(string& s);
    int ErrorInputOrOutput();
    bool contains(char* p, const string& s);
    
    int main()
    {
        ifstream inputFile( "env.txt" );
        ofstream outputFile( "protokoll.txt" );
        if (!inputFile || !outputFile)
            return ErrorInputOrOutput();
    
        for (string zeile; getline(inputFile, zeile) ; )
        {
            string umgebungsVar, inhalt;
            split(zeile, umgebungsVar, inhalt, ' ');
            if (!contains(getenv(umgebungsVar.c_str()), inhalt))
                outputFile << umgebungsVar << " " << inhalt << " nicht gesetzt " << endl;;
        }   
        return 0;
    }
    void split(const string& source, string& word1, string& word2, char delim)
    {
        string::size_type pos = source.find(delim);
        word1.assign(source, 0, pos);
        if (pos != string::npos)
            word2.assign(source, pos+1, string::npos);
    }
    string& toupper(string& s)
    {
        for (string::iterator it = s.begin(); it != s.end() ; ++it)
            *it = toupper(static_cast<unsigned char>(*it));
        return s;
    }
    int ErrorInputOrOutput()
    {
        cerr << "Fehlerhafte Eingabedatei oder Ausgabedatei" << endl;
        return -1;
    }
    bool contains(char* p, const string& s)
    {
        if (!p) return false;
        string asString(p);
        toupper(asString);
        return asString.find(s) != string::npos;
    }
    

    PS: Ist natürlich ungetestet. Kann also sein, dass ich beim Umschreiben ein paar Fehler reingehauen habe.
    Wichtig ist eigentlich nur die for-Schleife die eine bessere Variante demonstriert eine Datei Zeile-für-Zeile zu lesen.



  • Original erstellt von Tantor:
    Wie kann ich das verbessern ???

    Debugger benutzen und die Abbruchbedingungen überprüfen. An deinem Problem mist gar nix komisch. Logisch läuft er plötzlich bis zur letzten Zeile wenn du eine Zeile noch hinzufügst (Return drückst)

    -junix



  • [...stimmt, hume, sorry...]

    [ Dieser Beitrag wurde am 12.06.2003 um 14:44 Uhr von junix editiert. ]



  • @junix
    In der Regel scheint es das Beste zu sein, Beiträge von Spieleprogrammierer einfach zu ignorieren.
    Jedes drauf eingehen führt nur wieder zu einer Diskussion die noch sinnlosere Beiträge produziert und damit das eigentliche Thema mehr und mehr in den Hintergrund drängt.


Anmelden zum Antworten