Neue Nummerierung- text lesen und bearbeiten



  • Hallo zusammen,

    habe hier ein Programm welches neu nummeriert!
    Also z.B. sieht der Textfile so aus:

    0 GGGG
    3 GGGG
    2 GGGG

    Die Zahlen sollen dann incremental um 1 ausgegeben werden:
    Nun kann es sein das die erste Zeile aber mit % beginnt, dann soll nichts passieren. Zudem kann es sein das das erste Zeichen ein '/' oder 'N' ist. Die sollen auch beibehalten werden
    z.B. :
    %
    N6 GGGG
    N9 FFFF
    Soll:
    %
    N1 GGGG
    N2 FFFF

    hier mein Quellcode wo wahrscheinlich noch ein Fehler ist: Und hoffe mir kann wieder jemand helfen??!!
    Tut mir leid wenn ich nicht raffe wie man diesen richtig hier einfügt
    Vielen Dank!! Matthi

    [cpp][code]#include <string>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    
    int main(int argc,char *argv[])
    {
            using std::string;
    
            if(argc < 3)
            {
                    std::cerr << "Nicht genügend Argumente!\n";
                    return -1;
            }
    
            string helpname = std::string( argv[1] ) + argv[2];
    		//string helpname = "Test";
    
            string filename = helpname + ".mpf";
            string filename2 = helpname + "-copie.mpf";
    
            std::ifstream datei( filename.c_str() ); 
            std::ofstream datei2( filename2.c_str() );
    
    		for (std::string zeile ; getline(datei,zeile)  {
    			datei2 << zeile << '\n'; //statt endl '\n'
    		}
    
    		datei.close();
    		datei2.close();
    
    		std::ifstream datei3( filename2.c_str() ); 
    		std::ofstream datei4( filename.c_str() );
    
    		for (std::string zeile2 ; getline(datei3,zeile2)  {
                    if ( !zeile2.empty() ) 
                    {
                            if (zeile2[0] != ' ' || zeile2[0] != ';')
                            {
                                    std::ostringstream osstream;
    
                                    if (zeile2[0] == '/')
                                            osstream << '/'; 
                                    if (zeile2[0] == 'N')
                                            osstream << 'N';
    
                                    static size_t SeqNum(0);
                                    osstream << ++SeqNum;
    
                                    string str3 = zeile2.substr( zeile2.find(" ") );
    
                                    datei4 << osstream.str() + str3 << '\n'; 
                            }
                            else
                                    datei4 << zeile2 << '\n'; //statt endl '\n'
                    }
    		}
    
    			datei3.close();
    			datei4.close();
    			//rename(filename.c_str(), filename2.c_str());
    			remove(filename2.c_str());
    
    }
    

    [/code][/cpp]



  • #include <string>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    
    int main(int argc,char *argv[])
    {
        using std::string;
    
        if(argc < 3)
        {
            std::cerr << "Nicht genügend Argumente!\n";
            return -1;
        }
    
        string helpname = std::string( argv[1] ) + argv[2];
        //string helpname = "Test";
    
        string filename = helpname + ".mpf";
        string filename2 = helpname + "-copie.mpf";
    
        std::ifstream datei( filename.c_str() );
        std::ofstream datei2( filename2.c_str() );
    
        for (std::string zeile ; getline(datei,zeile) {
            datei2 << zeile << '\n'; //statt endl '\n'
        }
    
        datei.close();
        datei2.close();
    
        std::ifstream datei3( filename2.c_str() );
        std::ofstream datei4( filename.c_str() );
    
    for (std::string zeile2 ; getline(datei3,zeile2) {
        if ( !zeile2.empty() )
        {
            if (zeile2[0] != ' ' || zeile2[0] != ';')
            {
                std::ostringstream osstream;
    
                if (zeile2[0] == '/')
                    osstream << '/';
                if (zeile2[0] == 'N')
                    osstream << 'N';
    
                static size_t SeqNum(0);
                osstream << ++SeqNum;
    
                string str3 = zeile2.substr( zeile2.find(" ") );
    
                datei4 << osstream.str() + str3 << '\n';
            }
            else
                datei4 << zeile2 << '\n'; //statt endl '\n'
        }
    }
    
        datei3.close();
        datei4.close();
        //rename(filename.c_str(), filename2.c_str());
        remove(filename2.c_str());
    


  • Matthi70 schrieb:

    Hallo zusammen,

    habe hier ein Programm welches neu nummeriert!
    Also z.B. sieht der Textfile so aus:

    0 GGGG
    3 GGGG
    2 GGGG

    Die Zahlen sollen dann incremental um 1 ausgegeben werden:
    Nun kann es sein das die erste Zeile aber mit % beginnt, dann soll nichts passieren. Zudem kann es sein das das erste Zeichen ein '/' oder 'N' ist. Die sollen auch beibehalten werden
    z.B. :
    %
    N6 GGGG
    N9 FFFF
    Soll:
    %
    N1 GGGG
    N2 FFFF

    hier mein Quellcode wo wahrscheinlich noch ein Fehler ist: Und hoffe mir kann wieder jemand helfen??!!
    Tut mir leid wenn ich nicht raffe wie man diesen richtig hier einfügt
    Vielen Dank!! Matthi

    #include <string>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    
    int main(int argc,char *argv[])
    {
        using std::string;
        if(argc < 3)
        {
            std::cerr << "Nicht genügend Argumente!\n";
            return -1;
        }
    
        string helpname = std::string( argv[1] ) + argv[2];
        //string helpname = "Test";
    
        string filename = helpname + ".mpf";
        string filename2 = helpname + "-copie.mpf";
    
        std::ifstream datei( filename.c_str() ); 
        std::ofstream datei2( filename2.c_str() );
    
        for (std::string zeile ; getline(datei,zeile)  {
            datei2 << zeile << '\n'; //statt endl '\n'
        }
    
        datei.close();
        datei2.close();
    
        std::ifstream datei3( filename2.c_str() ); 
        std::ofstream datei4( filename.c_str() );
    
        for (std::string zeile2 ; getline(datei3,zeile2)  {
            if ( !zeile2.empty() ) 
            {
                if (zeile2[0] != ' ' || zeile2[0] != ';')
                {
                    std::ostringstream osstream;
    
                    if (zeile2[0] == '/')
                        osstream << '/'; 
                    if (zeile2[0] == 'N')
                        osstream << 'N';
    
                    static size_t SeqNum(0);
                    osstream << ++SeqNum;
    
                    string str3 = zeile2.substr( zeile2.find(" ") );
    
                    datei4 << osstream.str() + str3 << '\n'; 
                }
                else
                    datei4 << zeile2 << '\n'; //statt endl '\n'
            }
        }
        datei3.close();
        datei4.close();
        //rename(filename.c_str(), filename2.c_str());
        remove(filename2.c_str());
    }
    

    Hallo Matthi,

    Wenn Du meinst, dass da ein ansonsten ein Fehler drin ist, solltest Du uns noch einen Tipp geben wie sich der Fehler äußert. Zumindest hast Du in den Zeilen 24 und 34 vergessen, den for-Ausdruck zu schließen. Richtig muss es heißen:

    for (std::string zeile ; getline(datei,zeile); )  { // Zeile 24
        for (std::string zeile2 ; getline(datei3,zeile2); )  { // Zeile 34
    

    Zudem kann man einiges Vereinfachen - hilft dann auch beim Fehlersuchen. Auf das close kannst Du verzichten, wenn Du das Code-Segment in einen eigenen Scope packst - das schafft Übersicht. Auch brauchst Du beim Kopieren einer Datei nicht Zeile für Zeile kopieren, sondern im Stück.
    So können die Zeilen 21 bis 29 etwa so aussehen:

    {
            std::ifstream datei( filename.c_str() ); 
            std::ofstream datei2( filename2.c_str() );
            datei2 << datei.rdbuf();
        }
    

    Das Einlesen einer ganzen Zeile in einen String ist auch überflüssig. Es reicht doch das erste Zeichen zu lesen, alles bis zum Leerraum überlesen und dann den Rest der Zeile zu kopieren. Etwa so:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <limits> // std::numeric_limits<>
    
    int main(int argc,char *argv[])
    {
        using std::string;
        if(argc < 3)
        {
            std::cerr << "Nicht genügend Argumente!\n";
            return -1;
        }
    
        string helpname = std::string( argv[1] ) + argv[2];
        //string helpname = "Test";
    
        string filename = helpname + ".mpf";
        string filename2 = helpname + "-copie.mpf";
    
        {   // --   copy filename -> filename2
            std::ifstream datei( filename.c_str() ); 
            std::ofstream datei2( filename2.c_str() );
            datei2 << datei.rdbuf();
        }
    
        {   // --   Inhalt aus 'filename2' nach 'filename' neu durchnummeriert
            const std::streamsize ALL = std::numeric_limits< std::streamsize >::max();
            std::size_t SeqNum = 0; // besser vorher initialisiern, als static
            std::ifstream datei3( filename2.c_str() ); 
            std::ofstream datei4( filename.c_str() );
            for( char c; datei3 >> c; )
            {
                if( c == ';' || c == '%' )  // ; oder % ??
                {
                    datei3.ignore( ALL, '\n' );
                    continue; // Zeilen mit ';' am Anfang werden ignoriert
                }
                if( c == '/' || c == 'N' ) // oder auch: if( !isdigit( c ) )
                    datei4 << c; // in diesem Fällen erstes Zeichen mit übernehmen
                datei3.ignore( ALL, ' ' ); // Nummer überspringen
                datei4 << ++SeqNum << " ";
    
                string rest_der_zeile;
                if( getline( datei3, rest_der_zeile ) )
                    datei4 << rest_der_zeile << '\n';
            }
        } // <-- close geht hier automatisch
        remove(filename2.c_str());
    }
    

    Gruß
    Werner



  • Du hast zwar keine Frage gestellt, was nicht funktioniert.
    Du hast auch nicht geschrieben was passiert.

    Aber ich denke die Zeile if (zeile2[0] != ' ' || zeile2[0] != ';') macht nicht das, was du erwartest.

    Wenn zeile2[0] ein ';' ist, dann ist es trotzdem ungleich einem Leerzeichen. Also ist diese Bedingung immer wahr.


Anmelden zum Antworten