Einzelnen Beitrag anzeigen

Benutzerbild von PAX
PAX

Registriert seit: 22. Jun 2003
Ort: Karlsruhe
88 Beiträge
 
Delphi 7 Personal
 
#1

"Invalid Argument" bei read und write

  Alt 12. Nov 2006, 19:22
Nabend!

Nachfolgender Codeausschnitt soll eine Liste von Dateien zusammenfügen. Es wird dabei die erste Datei genommen und der Inhalt der restlichen Dateien Schritt für Schritt so schnell wie möglich angehängt.
Bei kleinen Dateien funktioniert das auch, aber bei mehreren zig MB Größe scheint ein Fehler aufzutreten, sowohl beim Einlesen, als auch beim Schreiben. Wenn ich immer nur 1 Byte gleichzeitig verarbeite, dann funktionierts fehlerfrei (ist aber zu langsam). Deshalb hab ich schon vermutet, dass es daran liegt, dass ich für den Zeiger "buffer" enorm viel Platz reservieren lasse - aber wenn das so in diesem Ausmaß nicht möglich ist, müsste mir das dann nicht der Compiler vorher sagen oder zumindest während der Programmausführung eine AV auftreten? Jedenfalls wird die Fehlervariable beim Öffnen der Datei und dem Setzen des Dateizeigers auf "Fehler 0" (kein Fehler) gesetzt, nur beim Lesen und Schreiben nachher sitzt sie auf "ungültiges Argument".
Also manchmal regt mich C++ auf! Sowas hatte ich bei Delphi bisher noch nie erlebt ! Hat jemand von euch eine Ahnung, worin das Problem liegt? Laut der Hilfe kann read oder write maximal UINT_MAX-1 Bytes lesen/schreiben.

Beste Grüße

Delphi-Quellcode:

  int quelldatei, zieldatei;
  unsigned long long groesse, geschrieben = 0;
  char *buffer = new char[UINT_MAX];

  zieldatei = open(Form1->Pfade->Strings[0].c_str(), O_WRONLY | O_BINARY, S_IREAD|S_IWRITE);
  lseek(zieldatei, 0, SEEK_END);
  for(unsigned long long i=1; i<Form1->Pfade->Count; i++) {
        quelldatei = open(Form1->Pfade->Strings[i].c_str(), O_RDWR | O_BINARY);
        groesse = lseek(quelldatei, 0, SEEK_END);
        lseek(quelldatei, 0, SEEK_SET);

        if(groesse > UINT_MAX-1) { //dieser Teil wird nicht ausgeführt
                geschrieben = groesse;

                while(geschrieben > UINT_MAX-1) {
                        read(quelldatei, buffer, UINT_MAX-1);
                        write(zieldatei, buffer, UINT_MAX-1);
                        geschrieben -= UINT_MAX-1;
                }


                read(quelldatei, buffer, geschrieben);
                write(zieldatei, buffer, geschrieben);
        } else { //dieser Teil wird ausgeführt und die Fehlermeldungen werden ausgegeben
                read(quelldatei, buffer, groesse); Application->MessageBoxA(_sys_errlist[errno],"Quelldatei lesen");
                write(zieldatei, buffer, groesse); Application->MessageBoxA(_sys_errlist[errno],"Zieldatei schreiben");
        }


        close(quelldatei);
  }
  close(zieldatei);
  delete buffer;
Andreas
"Wenn man irgendwann mal von allen akzeptiert wird, dann weiß man, dass man irgendwas falsch gemacht hat." Zitat: Herr Weidner

  Mit Zitat antworten Zitat