Was macht dieser Code ?



  • Hallo,

    ich habe hier einen Code in Zusammenhang mit der Dateiausgabe.
    Kann mir jemand sagen, was da passiert ?

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    using namespace std;
    
    main(int argc, char* argv[])
    {  
        if(argc!=4)
    { cout<<"Usage: change <filename> <byte> <char> \n";
      return 1;
    }
    fstream out(argv[1], ios::in|ios::out)
    if(!out)
    {
    cout<<"Cannot open file \n";
    return 1;
    }
    
    out.seekp(atoi(argv[2],ios::beg);
    out.put(*argv[3]);
    out.close();
    
    return 0;
    
    }
    

    Bin für jede Hilfe dankbar.



  • Hallo,
    in der Datei <filename> wird das Zeichen an der Position <byte> durch <char> ersetzt.



  • Hallo,

    kannst du es mir von Anfang an ausführlich erklären ?



  • In der Hoffnung jetzt nicht deine Hausaufgaben zu machen...

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    using namespace std;
    
    main(int argc, char* argv[])
    {  
        if(argc!=4)    //Wenn nicht 4 Argumente übergeben worden sind (das erste ist STandardmäßig der Pfad)
    { cout<<"Usage: change <filename> <byte> <char> \n";    //Fehlermeldung ausgeben :D
      return 1;
    }
    fstream out(argv[1], ios::in|ios::out)    //einen lese-schreib-fstream zur Datei übergeben als erstes (also zweites -ssiehe oben) Argument erstellen
    if(!out)    //Fehler beim erstellen? 
    {
    cout<<"Cannot open file \n";
    return 1;
    }
    
    out.seekp(atoi(argv[2],ios::beg);    //Zur Position übergeben als 2. Argument gehen (also das dritte argument in eine Ganzzahl umwandeln)
    out.put(*argv[3]);        //Argument 3 (also 4) einfügen
    out.close();
    
    return 0;
    
    }
    


  • Zuerst werden die Header geladen und der Namespace std aufgelöst:

    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    using namespace std;
    

    main() erhält zwei Parameter. Der erste beinhaltet die Anzahl der an das Programm übergebenen Parameter und der zweite die Parameter selbst. argv[0] ist immer der Programmname.

    main(int argc, char* argv[])
    {
    

    Jetzt wird überprüft, ob alle drei + eins Argumente (filename, byte, char + programmname am Anfang) übergeben wurden.

    Ist dies nicht der Fall, dann wird die Hilfe ausgegeben und das Programm beendet:
    [cpp]{ cout<<"Usage: change <filename> <byte> <char> \n";
      return 1;
    }
    

    Jetzt wird versucht, die angegebene Datei zu öffnen (die ja an argv[1] steht). ios::in und ios::out sagen, dass man auf die Datei lesend und schreibend zugreifen kann.

    fstream out(argv[1], ios::in|ios::out)
    

    Wenn irgendwas beim Öffnen der Datei schiefgelaufen ist, wird eine Fehlermeldung ausgegeben und das Programm beendet:

    if(!out)
    {
    cout<<"Cannot open file \n";
    return 1;
    }
    

    Jetzt kommt der eigentliche Zweck des Programms.
    Durch seekp springt man an eine bestimmte Stelle in einer Datei. Die Form sieht so aus:

    seekp(offset, start);
    

    offset ist der Abstand von start zum Zielpunkt. start ist dazu da, damit man weiß, worauf man sich mit dem Offset bezieht.
    In argv[2] ist der Offset zu ios::beg (Dateianfang) gespeichert. Er muss nur noch mit atoi() zu einem int umgeformt werden.

    out.seekp(atoi(argv[2],ios::beg);
    

    In argv[3] steht das ersetzende Byte. Die Datei steht schon durch die letzte Anweisung an der richtigen Stelle. Dann kanns ja losgehen:

    out.put(*argv[3]);
    

    In dieser überflüssigen Zeile wird die Datei wieder geschlossen. Überflüssig, weil der Destruktor das automatisch machen würde.

    out.close();
    
    return 0;
    
    }
    

    Das nächste Mal sagst du bitte etwas genauer, was du nicht verstanden hast.



  • Hallo,

    Danke,
    ist verständlich,
    aber wer übergibt dem Programm die 4 Parameter ?



  • Den ersten das OS, die anderen du.



  • Und wie und wo genau übergebe ich diese ?



  • Ich glaube du solltest dir noch mal das Kapitel "Parameterübergabe über die Kommandozeile" durchlesen 😉

    Wenn dein Programm test.exe heißt und du dieses so startest:

    test.exe test.txt 3
    

    Dann ist der erste Parameter, den du dem Programm übergibst 'test.txt' und der zweite '3'.

    Edit:
    Vielleicht verdeutlicht dieses Programm das ganze noch etwas:

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
            cout << endl << endl;
            cout << setw(20) << "Parameter" << setw(20) << "Ereicht mit" << setw(20) << "Index" << setw(20) << "Ausgabe";
            cout << endl << endl; 
            for(int i = 0; i < argc; i++)
            {
                    cout << setw(20) << "Parameter" << setw(20) << "*argv[i]" << setw(20) << i << setw(20) << *argv[i] << endl;
                    cout << setw(20) << "Parameter" << setw(20) << "argv[i]" << setw(20) << i << setw(20) << argv[i] << endl;
                    cout << setw(20) << "Adresse" << setw(20) << "&argv[i]" << setw(20) << i << setw(20) << &argv[i] << endl;
            }
            cout << endl << endl;
            return 0;
    }
    

    Caipi



  • Caipi schrieb:

    Ich glaube du solltest dir noch mal das Kapitel "Parameterübergabe über die Kommandozeile" durchlesen 😉

    Wenn dein Programm test.exe heißt und du dieses so startest:

    test.exe test.txt 3
    

    Dann ist der erste Parameter, den du dem Programm übergibst 'test.txt' und der zweite '3'.

    Nein, der erste Parameter ist test.exe:

    argv[0] = "test.exe"
    argv[1] = "test.txt"
    argv[2] = "3"
    argc    = 3
    


  • *Arghhh* *Wo ist der nächste Fettnapf?*

    Natürlich. du hast recht. [...] wobei wenn man bei 0 zu zählen beginnt, dann stimmt meine Aussage :p 😉 [...]

    Caipi


Anmelden zum Antworten