Anlegen von Dateien
-
Hallo,
mit dem Systemaufruf "open()" ist es ja möglich Dateien zu öffnen. Der Parameter O_CREAT sorgt dafür, dass eine Datei erzeugt wird wenn nicht vorhanden. Nun hab ich ein Problem. Ich möchte eine Datei in die (nichtvorhandene) Andere schreiben. Die Ausgabedatei wird zwar erzeugt, ist aber immer leer. Eine funktionierende Kopierunterfunktion ist vorhanden. Woran könnte dies liegen?
-
open() öffnet die Datei nur, lesen/schreiben nmußt du dann selber - z.B. mit read() bzw. write().
-
Wenn die Zieldatei leer ist funktioniert deine 'funktionierende Kopierfunktion' einfach nicht!
-
Die Kopierfunktion selbst funktioniert, wenn die zu kopierende Datei sowie die (leere) Ausgabedatei bereits vorhanden ist.
Hier mal ein Auszug:
int kopieren(int ein, int aus) { int n = 0; int rc = 0; char buffer[1024]; while((n = read(ein, buffer, 1024)) > 0 && (rc == 0)) { if(write(aus, buffer, n) != n) rc = 1; } if(n == -1) rc = 2; return rc; }
-
Und wie verwendest du diese Funktion? (btw, hast du auch daran gedacht, mögliche Fehler - sowohl beim Öffnen als auch beim Kopieren - abzufangen?)
-
Du hast die Datei aber schon zum lesen geoeffnet? O_CREATE alleine reicht als Modus naemlich nicht. Du brauchst schon O_RDWR | O_CREAT oder O_WRONLY | O_CREAT.
-
Also, die Funktion wird innerhalb von main einfach per
"n = kopieren(eingabe, ausgabe);" aufgerufen. Auftretende Fehler während des Öffnens werden dahingehend abgefangen, als das nach dem Öffnen auf einen Rückgabewert (von open) < 0 geprüft wird. Beim Kopiervorgang selbst werden durch die in der Funktion vergebenen Rückgabewerte (rc) je nach Fall Fehlermeldungen erzeugt (innerhalb main).
Die Dateien selbst öffne ich mit
eingabe = open(argv[1], O_RDONLY | O_CREAT, 0755); sowie
ausgabe = open(argv[2], O_WRONLY | O_CREAT, 0755);.
-
Existiert denn die Eingabedatei überhaupt? Und wieso öffnest du die überhaupt als O_CREAT, wenn du davon ausgehst, daß sie existieren sollte?
-
Die Eingabedatei existiert. Mit O_CREAT wollte ich später verwenden, falls die Eingabedatei auch nicht vorhanden wäre. Momentan geht es mir aber nur um mein obiges Problem. Soweit ich es verstanden habe zeigt O_CREAT sowieso keine Wirkung wenn die Datei bereits existiert.
-
Hab mein Problem gelöst. Der Fehler lag an einer anderen Stelle im Code. Vielen Dank trotzdem.