AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) C++ "Invalid Argument" bei read und write
Thema durchsuchen
Ansicht
Themen-Optionen

"Invalid Argument" bei read und write

Ein Thema von PAX · begonnen am 12. Nov 2006 · letzter Beitrag vom 21. Nov 2006
 
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, 18: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz