Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Im Binary-Mode Datensätze verändern

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Type



Anmeldungsdatum: 24.02.2006
Beiträge: 187
Wohnort: Dresden

BeitragVerfasst am: 02.01.2009, 14:31    Titel: Im Binary-Mode Datensätze verändern Antworten mit Zitat

Hallo Leute,

ich hab ein Programm geschrieben, welches eine Datei kopieren soll. (Kopierroutine hab ich aus der QBMonFaq grinsen )
- Klappt soweit ganz gut.
Wenn die Datei aber schon existiert soll sie allerdings aktualisiert werden.

Also wollte ich den Datensatz aus der Quell-Datei und der Zieldatei auslesen, ihn vergleichen und wenn er anders ist, den Quell-Datensatz in die Ziel-Datei an dem jeweiligen Punkt einfügen.
Leider macht FreeBasic das nicht. Er erkennt zwar, dass die Datensätze verschieden sind, aber es erfolgt kein Schreib-Zugriff.
Existiert die Datei hingegen gar nicht, wird sie Problemlos kopiert.
Kann es sein, das man bestehende Datensätze in einer Datei nicht ändern kann?

Ich möchte nicht die gesammte Datei noch einmal komplett kopieren und die alte ersetzen!

Code:
   DIM AS STRING Dat1, Dat2
   
   DIM AS INTEGER teil
   DIM AS LONGINT block
   DIM AS STRING c1,c2
   
   Dat1 = "original.txt"
   Dat2 = "kopie.txt"
   teil = 131072      '128KB Puffer

   c1 = ""
   c2 = ""
   block = 0
    OPEN Dat1 FOR BINARY ACCESS READ LOCK WRITE AS #1
      OPEN Dat2 FOR BINARY ACCESS READ WRITE LOCK READ WRITE AS #2
         DO UNTIL LOC(1) = LOF(1) OR INKEY = CHR(27)
               IF LOF(1) - LOC(1) < teil THEN
                  c1 = SPACE$(LOF(1) - LOC(1))
               ELSE
                  c1 = SPACE$(teil)
               END IF
               GET #1, block*teil, c1

               IF LOF(2) - LOC(2) < teil THEN
                  c2 = SPACE$(LOF(2) - LOC(2))
               ELSE
                  c2 = SPACE$(teil)
               END IF
               GET #2, block*teil, c2
               
               IF NOT c1 = c2 THEN PUT #2, block*teil, c1 'Hier steht der Befehl für den Schreibzugriff
               PRINT c1
               PRINT c2
                                             
               block +=1

               SLEEP 1
         LOOP
      CLOSE #2
   CLOSE #1


Achso und noch eine Frage:
Wie groß sollte der Lesepuffer sein? - Ich habe hier 128 KB genommen, was mir ziemlich groß erscheint. Außerdem verdoppelt sich ja, aufgrund der zwei Lese-Vorgänge der Speicherbedarf.

MfG Type
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 02.01.2009, 15:56    Titel: Antworten mit Zitat

Hi,
ich vermute deine Dateien sind kleiner als 128kByte?
Dann wird hier
Code:
IF NOT c1 = c2 THEN PUT #2, block*teil, c1
nicht in die Ziel-Datei geschrieben, da sie die Datenmenge (128kB) nicht abnehmen kann mit den Augen rollen .
Bei kleinerer Blockgröße
Code:
teil = 100
geht es zwinkern .
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Type



Anmeldungsdatum: 24.02.2006
Beiträge: 187
Wohnort: Dresden

BeitragVerfasst am: 02.01.2009, 18:01    Titel: Antworten mit Zitat

Hallo,

Alles klar, jetzt geht es.
Allerdings eröffnen sich mir gerade neue Probleme:
    Dadurch das man ja alle Dateien kopieren können soll (also auch sehr kleine) habe ich zwischen den beiden Open-Befehlen noch eine Abfrage gesetzt, die den Puffer gegebenenfalls verkleinern soll.
    Code:
        OPEN Dat1 FOR BINARY ACCESS READ LOCK WRITE AS #1
          IF LOF(1) < teil THEN teil = LOF(1)
          OPEN Dat2 FOR BINARY ACCESS READ WRITE LOCK READ WRITE AS #2

    Aber irgendwie hat es keinen Effekt. - Ich weis nicht, ob es für die Performance klug ist, ab 128KB alles byteweise zu kopieren. - also z.B. mit:
    Code:
    IF LOF(1) < teil THEN teil = 1

    - was aber Funktioniert durchgeknallt

    Das nächste Problem ist, dass es zu Fehlern kommt, wenn die Blöcke am Ende ungleich groß sind. (Wenn also die Quell-Datei größer oder kleiner ist, als die Zieldatei.)
    Ist die Quelle größer als das Ziel, so wird mit der PUT-Anweisung nichts geschrieben.
    Ist die Quell-Datei kleiner, so müsste man den Rest vom Ziel abschneiden. -> wie geht das!?


Danke schonmal für eure Mühe!
MfG Type
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz