Debug error/Debug Libary



  • Matthi70 schrieb:

    [...]

    found=zeile.find(" ");
    		str3 =zeile.substr(found);
    

    Watt is'n, wenn es gar kein Leerzeichen in zeile gibt?

    Du musst nicht für jeden und alles eine Variable einführen. Das und diese Deklarationen am Anfang ist schlecht zu lesen...Es sei denn, Du bist Consultant und wirst pro Zeile bezahlt...Dann könnte Dich das bei dem Code geschätzt knapp die Hälfte Deines Einkommens kosten 😉

    z.B.

    string ext = ".h";
        string helpname = argument1 + argument2 ;
        filename = helpname + ext;
        filename2 = helpname + "-copie.h";
        const char * newname = filename.c_str();
        const char * newname2 = filename2.c_str();
        fstream datei(newname,ios::in);
        fstream datei2(newname2,ios::out);
    

    Koennte auch kuerzer sein:

    const string helpname = string(argv[1]) + string(argv[2]);
        const string filename = helpname + ".h";
        const string filename2 = helpname + "-copie.h";
        fstream datei(filename.c_str(), ios::in);
        fstream datei2(filename2.c_str(), ios::out);
    

    Oder aus dem hier:

    zeichenEins=zeile[0];
                if (zeichenEins!= " ")
                {
                    if (zeichenEins=="/")
                        slash=true;
                    else
                        slash=false;
    

    Wird das:

    const char zeichenEins=zeile[0];
                if (zeichenEins != ' ')
                {
                    const bool slash = zeichenEins=='/';
    

    Cheers!



    • Statt
    #include <cctype>  //Brauchst du nicht
    #include <stdio.h> //Brauchst du nicht
    #include <stdlib.h> //Brauchst du nicht
    #include <string.h> //Brauchst du nicht
    

    binde

    ein 😉

    string argument1,argument2;
    argument1= argv[1];
    argument2= argv[2];

    
    Keiner definiert, wieviele Argumente an dein Programm übergeben worden sind (allerhöchstens der Standard, nähmlich das es mindestens einer ist). Mach lieber  
    
    ```cpp
    if(argc < 3)
    {
        std::cerr << "Nicht genügend Argumente!\n";
        return -1;
    }
    
    std::string argument1( argv[1] ),
                argument2( argv[2] );
    
    • Filestreams musst du nicht schließen, schon gar nicht vor dem Ende des Scopes in dem sie deklariert worden sind (da der Destruktor ja wenn nötig close() aufruft).
    • Dazu musst du auch nicht std::ios::in/out als Flag im Konstruktor eines Filestreams angeben, weil das bei std::ofstream/ifstream sowieso immer als angegeben behandelt wird.
    • Und return (0); kannst du

    1. Weglassen
    2. Lässt man Klammern bei solch trivialen "Ausdrücken" gern mal weg 😉

    Alles in allem habe ich mir die Zeit genommen den Code etwas zu bessern (wahnsinn, was da alles scheiße war):

    #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 filename = helpname + ".h";
            string filename2 = helpname + "-copie.h";
    
            std::ifstream datei( filename.c_str() ); //Das sind ifstreams und ofstreams ;)
            std::ofstream datei2( filename2.c_str() );
    
            for (std::string zeile ; getline(datei,zeile) ;)
                    if ( !zeile.empty() ) //Da gibt es so eine Membermethode...
                    {
                            if (zeile[0] != ' ')
                            {
                                    std::ostringstream osstream;
    
                                    if (zeile[0] == '/')
                                            osstream << '/'; //Statt diesen String- lieber ein paar Character-Literale
    
                                    static size_t SeqNum(0);
                                    osstream << ++SeqNum;
    
                                    string str3 = zeile.substr( zeile.find(" ") );//Achtung! Kann std::outofrange Exception werfen
    
                                    datei2 << osstream.str() + str3 << '\n'; //statt endl '\n'
                            }
                            else
                                    datei2 << zeile << '\n'; //statt endl '\n'
                    }
    }
    


  • Hallo,

    sehr vielen Dank. Jaa blutiger Anfänger. Letzte Mal programmiert mit BASIC auf

    Ein anderes Problem ist , ich wollte eigentlich keine Kopie erstellen, sondern LESEN und direkt SCHREIBEN. War ein wenig überfordert damit, daher so beholfen.
    Gibt es dafür auch eine Möglichkeit??

    Noch mal vielen Dank für die tolle Hilfe. Werde es mir genau anschauen.

    Schone Gruß 🙂



  • was meinst du mit "LESEN und direkt SCHREIBEN"?



  • Ja die Datei , welche ich öffne möchte ich überarbeiten. Weil ich nicht wusste wie man die ändern kann und speichert. Habe ich eine neue Datei erstellt.



  • Hallo zusammen,

    ....letzte Mal programmiert mit Basic auf COMMODORE C64....

    Für mich ist wohl die Einsicht gekommen mal einen Nachhilfelehrer zu nehmen.

    Denn ich habe versucht das erste Argument:
    //argv[1]="Q:\Cimdat\GPP2testdaten\";
    in
    //argv[1]="Q:\\Cimdat\\GPP2testdaten\";
    wegen diesen Debug Error

    [code]		string str= argv[1];
    		for(size_t i = 0; i < str.length(); ++i)
    			if(str=='\')
    			 str.insert(i--,'\');
    

    [/code]

    den Code binden: Wie geht das?

    hier wollte ich den Originalnamen behalten.

    datei.close();
    datei2.close();

    remove(filename); // Original Datei löschen
    rename(filename2, filename); // tempomäre Datei umbenenne

    Vielen Dank an alle



  • Dateien loeschen oder umbenennen gehoert nicht zu Standard-C++. Versuch es mal mit Boost.Filesystem.



  • Sone schrieb:

    Dateien loeschen oder umbenennen gehoert nicht zu Standard-C++. Versuch es mal mit Boost.Filesystem.

    Genau, weil ich mal ne Datei umbenennen will, lade ich mal eine fette Lib runter. boost::filesystem ist auch nicht Standard-C++.
    #include <dirent.h>, problem solved.



  • Sone schrieb:

    Dateien loeschen oder umbenennen gehoert nicht zu Standard-C++.

    Doch: std::remove() und std::rename() aus der C-Standardbibliothek. Für weitere Dateisystemoperationen ist man mit Boost.Filesystem jedoch besser beraten.



  • Nexus schrieb:

    Sone schrieb:

    Dateien loeschen oder umbenennen gehoert nicht zu Standard-C++.

    Doch: std::remove() und std::rename() aus der C-Standardbibliothek. Für weitere Dateisystemoperationen ist man mit Boost.Filesystem jedoch besser beraten.

    Ach, stimmt, die kannte ich noch gar nicht.
    Hab mich halt nur mit den C++ Filestreams auseinandergesetzt...


Anmelden zum Antworten