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:

Löschen von Datansätzen in Datei

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



Anmeldungsdatum: 17.09.2004
Beiträge: 9

BeitragVerfasst am: 06.03.2005, 02:25    Titel: Löschen von Datansätzen in Datei Antworten mit Zitat

Hallo zusammen...

Ich arbeite gerade mit Dateien für direkten Zugriff via Type- Buffer. Schreiben und lesen ist kein Thema - aber nun besteht die Notwendigkeit einzelne Datensätze aus dieser Datei zu löschen. Wie bitte das?

'Get' zum lesen, 'Put' zum schreiben - aber was zum Henker zum löschen?

#
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 06.03.2005, 02:44    Titel: Antworten mit Zitat

Hallo

Einen einfachen Befehl vergleichbar GET oder PUT gibt es fürs Löschen nicht. Du könntest einfach alle Einträge bis auf den zu löschenden in eine neue Datei kopieren.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Paul
aka ICC, HV-Freak


Anmeldungsdatum: 11.09.2004
Beiträge: 588
Wohnort: Uelzen

BeitragVerfasst am: 06.03.2005, 03:56    Titel: Antworten mit Zitat

Hab ich mir grad mal ausgedacht:
Code:

Entry = 3 'Zu löschender Eintrag
OPEN Inputfile$ FOR INPUT AS #1
OPEN Tempfile$ FOR OUTPUT AS #2
FOR a = 1 TO Entry - 1
 LINE INPUT #1, Record$
 PRINT #2, Record$
NEXT a

LINE INPUT #1, Doof$

DO WHILE NOT EOF(1)
 LINE INPUT #1, Record$
 PRINT #2, Record$
LOOP
CLOSE #2
CLOSE #1
NAME Tempfile$ AS Inputfile$


Der Code setzt vorraus dass ein Eintrag immer nur aus einer Zeile besteht, du musst das noch entsprechend an deinen TYPE-Buffer angleichen.
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Charly2



Anmeldungsdatum: 28.11.2004
Beiträge: 29
Wohnort: Mittelfranken

BeitragVerfasst am: 06.03.2005, 08:37    Titel: Antworten mit Zitat

Ich arbeite viel mit Random-Dateien.
Zum Löschen setzte ich einfach alle Felder auf leer bzw. null und schreibe diesen leeren Datensatz mit PUT in die Datei.
Hier entstehen natürlich Lücken, die bei nächster Gelegenheit, wenn ein neuer Datensatz erstellt wird, wieder geschlossen werden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
McArden



Anmeldungsdatum: 17.09.2004
Beiträge: 9

BeitragVerfasst am: 06.03.2005, 13:54    Titel: Antworten mit Zitat

Oh, oh,

ich habe es geahnt. Das mit dem umkopieren wollte ich eigentlich vermeiden. Die Datei um die es geht könnte locker 4MB überschreiten. Das heißt dann also 3,9MB umkopieren, weil ein Datensatz raus muß...

- Das leben ist die Hölle -

Erstmal vielen Dank. Wenn jemandem noch was aderes einfällt, wäre ich über einen Tip sehr dankbar.

- MIST -

#
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 06.03.2005, 14:18    Titel: Antworten mit Zitat

Hallo

Die einzige Möglichkeit ohne Umkopieren die mir einfällt, wäre eine zweite Datei anzulegen in der drinsteht, welche Einträge aus der ersten ungültig sind und diese dann beim Einlesen zu überspringen. Dann lassen sich "gelöschte" Datensätze sogar wieder herstellen. Natürlich wird die Datei so nicht kleiner.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 06.03.2005, 14:33    Titel: Antworten mit Zitat

Bitte noch nicht aufgeben wegen dem Datei verkürzen - im Reich vom DOS-API (das berühmte CALL INTERRUPT) verbirgen sich wieder einmal einige Goldschätze. Lies sonst einmal diesen Beitrag:

http://groups.google.com/groups?th=230f7e13ef8e5f94

=> Demnach sollte es also möglich sein, eine Datei quasi echt abzuschneiden.

@McArden:
Für Dein Problem eine kleine Anleitung:
1.) Füll die Lücke Deiner Direktzugriffsdatei mit dem letzten Datensatz - alles noch ordinär mit QB möglich.
2.) Nun würde ich die Datei direkt mit CALL INTERRUPT öffnen (Handle-Funktionen von MS-DOS 2.0+), Dateiposition aufs gewünschte Ende setzen und wie auf Ralf Browns Interrupt-Liste beschrieben einen Schreibzugriff von 0 Bytes durchführen, womit DOS/Windows den Rest abschneidet. Anschliessend Datei schliessen.

Das Ganze kam mir wieder in den Sinn, da ich ganz früher einmal in der Dokumentation eines Modula-2-Compilers eine entsprechende Bibliotheksfunktion gesehen hatte, wo im Wesentlichen der Compilerhersteller diesen CALL INTERRUPT darin verpackt hat.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 06.03.2005, 15:09    Titel: Beispielprogramm zum Thema Datei abschneiden Antworten mit Zitat

Habe noch ein Beispiel zum Thema Datei abschneiden geschrieben:

http://beilagen.dreael.ch/QB/FILECUT.BAS

Am besten einmal ausprobieren => Damit wird Umkopieren definitiv überflüssig. :-)
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Charly2



Anmeldungsdatum: 28.11.2004
Beiträge: 29
Wohnort: Mittelfranken

BeitragVerfasst am: 06.03.2005, 15:18    Titel: Antworten mit Zitat

Man kann es auch so machen wie früher bei der Datenbank DBase.
Die gelöschten Datensätze mit einem speziellen Kennzeichen markieren.
Die werden dann bei der Bearbeitung übersprungen.
Irgendwann kann man dann einen Komprimierungslauf machen,
wo die Datensätze ohne die als gelöscht markierten Sätze kopiert
werden. Dadurch wird die Datei wieder verkleinert.
Dadurch muß nicht bei jedem Löschen der Kopiervorgang durchgeführt werden.
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 QBasic. 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