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