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:

Einfaches Kopierprogramm

 
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
Basic-01



Anmeldungsdatum: 09.11.2019
Beiträge: 9

BeitragVerfasst am: 13.12.2019, 15:01    Titel: Einfaches Kopierprogramm Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 13.12.2019, 17:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 14.12.2019, 17:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Basic-01



Anmeldungsdatum: 09.11.2019
Beiträge: 9

BeitragVerfasst am: 16.12.2019, 11:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 17.12.2019, 14:21    Titel: Antworten mit Zitat

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? grinsen
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Basic-01



Anmeldungsdatum: 09.11.2019
Beiträge: 9

BeitragVerfasst am: 22.12.2019, 15:41    Titel: Antworten mit Zitat

Danke Leute, damit komme ich jetzt weiter!
_________________
EIN Tier wird auf Youtube getötet = Riesenaufschrei.
Das hier juckt aber keinen: https://live-counter.com/weltweit-getoetete-tiere/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Haubitze



Anmeldungsdatum: 14.10.2009
Beiträge: 132

BeitragVerfasst am: 23.12.2019, 07:50    Titel: Antworten mit Zitat

@grindstone hm in etwa so?
Code:
 g="Und der Frosch sprang in den Teich."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 23.12.2019, 15:52    Titel: Antworten mit Zitat

Richtig! grinsen grinsen grinsen

Gruß und frohes Fest
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail 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