|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Basic-01
Anmeldungsdatum: 09.11.2019 Beiträge: 9
|
Verfasst am: 13.12.2019, 16:01 Titel: Einfaches Kopierprogramm |
|
|
Man kann ja mit FreeBasic Dateien lesen und schreiben.
Ich finde aber keinen Befehl welcher einfach eine Datei Byte für Byte kopiert.
Ich möchte z.B. eine Textdatei mit 1 MB Länge kopieren.
Nun soll das erste Byte der Ausgangsdatei gelesen werden, und in der neuen Datei 2 geschrieben werden.
Byte für Byte.
Ich weiss dass es einen extra Befehl gibt mit dem man ganze Dateien kopieren kann, ich möchte aber die Datei nicht nur kopieren, sondern einige Wörter durch andere ersetzen.
Deshalb wäre der erste Schritt mal, dass das Kopieren auf diese Weise funktioniert.
Bei Powerbasic gab es einen "Zeiger", der nach dem Kopieren eines Bytes immer eins nach vorne gezählt wird.
Ist das bei FB genau so? _________________ EIN Tier wird auf Youtube getötet = Riesenaufschrei.
Das hier juckt aber keinen: https://live-counter.com/weltweit-getoetete-tiere/ |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4608 Wohnort: ~/
|
Verfasst am: 13.12.2019, 18:08 Titel: |
|
|
Zunächst einmal kannst du auf C-Routinen wie memcpy zugreifen (zur C Runtime unter FreeBASIC siehe hier). Du scheinst mir aber eher folgendes zu suchen: Wenn du die Datei AS BINARY öffnest, kannst du (auf Wunsch) byteweise auslesen, und der Dateizeiger wandert jeweils mit. Die Position des Zeigers kannst du mit SEEK lesen bzw. schreiben.
In deinem Fall würde das heißen: Erste Datei zum Lesen, zweite zum Schreiben öffnen (beide AS BINARY), Byte für Byte aus der ersten Datei mit GET# lesen und in die zweite Datei mit PUT# schreiben; ohne Angabe der zu bearbeitenden Position wird die aktuelle Position des Dateicursors verwendet. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1217 Wohnort: Ruhrpott
|
Verfasst am: 14.12.2019, 18:01 Titel: |
|
|
Im Großen und Ganzen stimme ich mit nemored überein, wenn du allerdings den Dateiinhalt als Text bearbeiten möchtest, ist es sinnvoller, diesen in einen String einzulesen, dann kannst du die vorhandenen FB - Stringfunktionen zum Bearbeiten benutzen. Im einfachsten Fall (wenn die Datei komplett in den Arbeitsspeicher passt) sähe das etwa so aus: Code: | Dim As String quelle, ziel, g
quelle = "C:\meineQuellDatei.txt"
ziel = "C:\meineZielDatei.txt"
Open quelle For Binary Access Read As #1
Open ziel For Output As #2
g = Input(Lof(1), #1)
'...
'Bearbeiten des Dateiinhalts
'...
Print #2, g;
Close | Nicht das Semikolon hinter dem PRINT vergessen, sonst wird ein unerwünschtes CR/LF angehängt.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Basic-01
Anmeldungsdatum: 09.11.2019 Beiträge: 9
|
Verfasst am: 16.12.2019, 12:29 Titel: |
|
|
Hallo grindstone!
Deine Lösung sieht eleganter aus.
Habe eine 800 MB grosse Datei damit kopiert.
Hat 3 Sekunden gedauert.
Ich kann also auch grosse Textdateien direkt im Arbeitsspeicher bearbeiten.
Muss mal nach den String-Funktionen schauen.
EDIT:
Kann ich den String so manipulieren:
Erstens: Dieser soll durchsucht werden und jede Zeile die ein bestimmtes Wort enthält wird gelöscht.
Zweitens:
kann man den String nach eine Zeichenkette z.B. "&googleid=" durchsuchen, und dann diesen und den Text bis zum nächsten & Zeichen löschen?
So dass aus
wetterdatenblablablammmmmm&googleid=2647825922382649836482732964934816232164&s=82736
wetterdatenblablablammmmmm&s=82736
wird?
Was passiert mit der Stringlänge wenn Texte gelöscht werden? _________________ EIN Tier wird auf Youtube getötet = Riesenaufschrei.
Das hier juckt aber keinen: https://live-counter.com/weltweit-getoetete-tiere/ |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1217 Wohnort: Ruhrpott
|
Verfasst am: 17.12.2019, 15:21 Titel: |
|
|
Basic-01 hat Folgendes geschrieben: | Erstens: Dieser soll durchsucht werden und jede Zeile die ein bestimmtes Wort enthält wird gelöscht. | Für so etwas benutzt man am besten Zeiger (im Beispiel "von" und "bis" genannt), die man den Text entlanglaufen lässt. Das Suchen und Löschen ist nicht allzu kompliziert, allerdings erfordert die korrekte Behandlung der Zeilenumbrüche etwas Aufmerksamkeit: Code: | Dim As String g, suchwort
Dim As Integer von, bis
g = "Unter impulsivem Einsatz immanenter, " + Chr(13,10) + _
"jedoch bis zum Zeitpunkt der Effektuierung latenter Energien" + Chr(13,10) + _
"löste sich die amphibielle Kreatur von ihrem habituellen Standort" + Chr(13,10) + _
"und verschwand, eine von den Wurfgesetzen diktierte Parabellinie beschreibend" + Chr(13,10) + _
"in den mehr oder minder transparenten Räumen ihrer Existenz."
suchwort = "Kreatur"
Print g
Do While InStr(g, suchwort) 'schleife durchlaufen, solange der string das gesuchte wort enthält
von = InStr(g, suchwort) '1. auftreten des suchwortes
bis = InStr(von, g, Chr(13,10)) 'auf das suchwort folgender zeilenumbruch
von = InStrRev(g, Chr(13,10), von) 'dem suchwort vorangehender zeilenumbruch
If von Then 'suchwort steht NICHT in der 1. zeile (sonst ist von = 0)
von += 1 'zeiger korrigieren
EndIf
If bis Then 'bis <> 0, d.h. nach dem suchwort folgt ein zeilenumbruch
bis += 2 'endzeiger hinter den zeilenumbruch setzen
Else 'bis = 0, d.h. nach dem suchwort folgt KEIN zeilenumbruch mehr
von -= 2 'anfangszeiger vor den zeilenumbruch der vorherigen zeile setzen
EndIf
g = Left(g, von) + Mid(g, bis) 'zeile mit suchwort aus dem text entfernen
Loop
Print "---"
Print g
Print "---" | Das kann man noch etwas optimieren, indem man das Suchwort nicht jedesmal vom Textbeginn an suchen lässt (und vor allem nicht zweimal), sondern von der Stelle an, auf die "von" zeigt, aber zur Verdeutlichung des Prinzips soll das hier erst einmal reichen.
Basic-01 hat Folgendes geschrieben: | Zweitens:
kann man den String nach eine Zeichenkette z.B. "&googleid=" durchsuchen, und dann diesen und den Text bis zum nächsten & Zeichen löschen? | Das ist etwas einfacher: Code: | Dim As String g
Dim As Integer von, bis
g = "wetterdatenblablablammmmmm&googleid=2647825922382649836482732964934816232164&s=82736"
Print g
von = InStr(g, "&googleid=")
bis = InStr(von + 1, g, "&")
g = Left(g, von - 1) + Mid(g, bis)
Print g |
Basic-01 hat Folgendes geschrieben: | Was passiert mit der Stringlänge wenn Texte gelöscht werden? | Sie wird kleiner.
Aber das ist der Vorteil der "String"-Methode gegenüber der Verwendung von GET und PUT mit alloziertem Speicher: Um die Speicherverwaltung kümmert sich das Programm, da brauchst du dir überhaupt keinen Kopf drum zu machen. Allerdings auf Kosten der Arbeitsgeschwindigkeit, aber das ist nur bei SEHR großen Datenmengen von Belang.
Gruß
grindstone
PS: Den Satz aus dem ersten Beispiel hat man einmal böswilligerweise einem Wissenschaftler untergeschoben. Kleines Weihnachtsrätsel (@ Alle): Wie lautet dieser Satz in verständlichem Deutsch? _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Basic-01
Anmeldungsdatum: 09.11.2019 Beiträge: 9
|
|
Nach oben |
|
|
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 23.12.2019, 08:50 Titel: |
|
|
@grindstone hm in etwa so? Code: | g="Und der Frosch sprang in den Teich." |
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1217 Wohnort: Ruhrpott
|
Verfasst am: 23.12.2019, 16:52 Titel: |
|
|
Richtig!
Gruß und frohes Fest
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|
|
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.
|
|