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:

Problem: Bytes abschneiden, Datei speichern

 
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
jensma



Anmeldungsdatum: 16.05.2005
Beiträge: 85
Wohnort: Gleich neben Frankfurt, zwei Zimmer neben Lloyd!

BeitragVerfasst am: 15.10.2012, 20:24    Titel: Problem: Bytes abschneiden, Datei speichern Antworten mit Zitat

Hallo Forum!

Ich möchte, wie in der Überschrift schon vorgewarnt, Bytes vom Anfang einer Datei abschneiden und wieder abspeichern.

Leider komme ich nicht sehr weit, hier mal mein gescheiterter Versuch:
Code:

  Dim datei As String
  Dim tempfile As string
 
   
  datei = "cutme.bin"
  tempfile = "temp.bin"
 
  OPEN datei FOR BINARY AS #1
     
       Get #1, 512, tempfile
 
     Open tempfile For Binary As #2
       Put #2,, tempfile
     Close #2
   
  Close #1


Ich denke mein Fehler liegt beim GET, da der String tempfile immer leer bleibt.

Vielleicht hat jemand von euch ja eine zündene Idee lächeln
(Ich arbeite mit WindowsXP und der neustes Version des Compilers)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 15.10.2012, 20:29    Titel: Antworten mit Zitat

Hmm, ich weiß nicht genau, was das werden soll ... Du öffnest eine Datei, liest ab Position 512 acht Zeichen aus (weil der String, in den du speicherst, so lang ist) und öffnest dann eine Datei, die so heißt, wie das was du vorhin ausgelesen hast - ich glaube nicht, dass das so geplant ist.
_________________
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
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 15.10.2012, 21:04    Titel: Antworten mit Zitat

man tail
man head

lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 15.10.2012, 21:22    Titel: Antworten mit Zitat

jensma hat Folgendes geschrieben:
(Ich arbeite mit WindowsXP und der neustes Version des Compilers)


Handelt es sich um ein bestimmtes Dateiformat oder einfach nur die ersten Bytes hierhin und die restlichen dorthin?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jensma



Anmeldungsdatum: 16.05.2005
Beiträge: 85
Wohnort: Gleich neben Frankfurt, zwei Zimmer neben Lloyd!

BeitragVerfasst am: 15.10.2012, 22:40    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Hmm, ich weiß nicht genau, was das werden soll ... Du öffnest eine Datei, liest ab Position 512 acht Zeichen aus (weil der String, in den du speicherst, so lang ist) und öffnest dann eine Datei, die so heißt, wie das was du vorhin ausgelesen hast - ich glaube nicht, dass das so geplant ist.


Ich will den gesamten Rest der Datei nach dem 512ten Byte in eine neue Datei speichern. Damit will ich die ersten 512 Bytes abschneiden. Die Info mit dem String ist schon mal gut - ich wusste nicht, dass der nur acht Zeichen speichert.

Zitat:
man tail
man head


Tut mir Leid, ich muss es unter Windows machen lächeln

Zitat:
Handelt es sich um ein bestimmtes Dateiformat oder einfach nur die ersten Bytes hierhin und die restlichen dorthin?


Es handelt sich um kein bestimmtes Dateiformat, das sind einfach nur Binärdateien.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 15.10.2012, 23:06    Titel: Antworten mit Zitat

jensma hat Folgendes geschrieben:
Zitat:
man tail
man head


Tut mir Leid, ich muss es unter Windows machen lächeln
Kein Open-Source-Entwickler würde sich einen Dreck mit Windows beschäftigen, wenn es nicht das MinGW/MSYS/Cygwin-Ökosystem gäbe, welches u.a. die GNU coreutils mit all den Standard UNIX-Tools unter Windows nutzbar macht.
Neben vernünftigen Browsern (Chrom(ium), Opera) und vernünftigen Mediaplayern (MPC-HC, VLC) doch das allererste, was man auf einer Windowsbox installiert, damit man damit überhaupt was ausrichten kann...

/e: Ich vergas den vernünftigen Texteditor (Sublime Text 2) und natürlich LaTeX, LyX und die restlichen Tools, die Windows eigentlich haben sollte, aber trotzdem nicht mitbringt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 15.10.2012, 23:09    Titel: Antworten mit Zitat

Speichere es auf jeden Fall in eine andere Variable (nicht tempstring, das brauchst du nachher doch noch), und sorge dafür, dass sie zuvor groß genug ist.
Code:
variable = SPACE(LOF(1)-512)

vor dem Auslesen dürfte ein guter Ansatz sein, aber ohne Garantie.
_________________
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
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 15.10.2012, 23:10    Titel: Antworten mit Zitat

28398, steige mal von deinem hohen Ross ab...
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 15.10.2012, 23:13    Titel: Antworten mit Zitat

Ich denk gar nicht dran.

Ist ja nicht gerade umstritten, dass die mit Windows kommenden Werkzeuge mangelhaft sind (Hat die Powershell überhaupt schon mehr oder weniger alle Tools der coreutils drin?)...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 15.10.2012, 23:20    Titel: Antworten mit Zitat

Deine Meinung ist weder hilfreich noch allgemeingültig. Ich entwickle jedenfalls schon jahrelang OSS unter Windows, ohne MinGW jemals installiert gehabt zu haben. => Es geht offensichtlich auch ohne.

Naja, jedenfalls hat nemored da schon den richtigen Ansatz zum eigentlich Problem geliefert - wenn du die Variable tempfile für zwei verschiedene Zwecke verwendest, kann das nur schief gehen.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jensma



Anmeldungsdatum: 16.05.2005
Beiträge: 85
Wohnort: Gleich neben Frankfurt, zwei Zimmer neben Lloyd!

BeitragVerfasst am: 15.10.2012, 23:20    Titel: Antworten mit Zitat

28398 hat Folgendes geschrieben:
jensma hat Folgendes geschrieben:
Zitat:
man tail
man head


Tut mir Leid, ich muss es unter Windows machen lächeln
Kein Open-Source-Entwickler würde sich einen Dreck mit Windows beschäftigen, wenn ... nicht mitbringt.


Danke für den Hinweis, aber ich sitze gerade an meinem Dienstlaptop, da kann ich keine Virtualisierungen vornehmen. Und das Betriebssystem kann ich erst recht nicht ändern lächeln In der Firma nutze ich das Gerät sowieso nur als Client für Großrechneranwednungen. Das nur am Rande lächeln

Zitat:
variable = SPACE(LOF(1)-512)


Danke für den Schnipsel! Allerdings ist meine Ausgabedatei jetzt kaputt, prall gefüllt mit Leerzeichen traurig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 15.10.2012, 23:21    Titel: Antworten mit Zitat

Die SPACE-Zeile dient ja auch nur dazu, um den String passend zu dimensionieren. Danach kannst du "variable" verwenden, um so viele Bytes aus der Datei auszulesen wie notwendig.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
jensma



Anmeldungsdatum: 16.05.2005
Beiträge: 85
Wohnort: Gleich neben Frankfurt, zwei Zimmer neben Lloyd!

BeitragVerfasst am: 15.10.2012, 23:26    Titel: Antworten mit Zitat

Oh super, danke! Jetzt funktioniert es tadellos lächeln

Danke für die späte Hilfe, jetzt kann ich beruhigt schlafen lächeln)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 16.10.2012, 11:06    Titel: Antworten mit Zitat

ungetestet, sollte aber funzen:

Code:
Dim TFileNum as Integer                                 'Eine Variable welche die Dateinummer speichert, mit welcher der Zugriff auf diese ermöglicht wird.
Dim TFilePfadNameIn as String = "temp.dat"                  'Die eingangsdatei
Dim TFilePfadNameOut1 as String = "temp_out1.dat"            'die ausgangsdatei 1
Dim TFilePfadNameOut2 as String = "temp_out2.dat"            'die ausgangsdatei 2
Dim T1 as String                                    'eine temporäre variable für String-Daten
Dim T2 as String                                    'eine temporäre variable für String-Daten

TFileNum = FreeFile                                    'Eine Freie Dateinummer erzeugen
If Open(TFilePfadNameIn for Binary as #TFileNum) <> 0 Then      'wenn datei nicht geöffnet werden konnte
   Print "konnte datei nicht öffnen! muss beenden!"         'dann fehler ausgeben
   End -1                                          'und programm beenden
End If

T1 = Space(512)                                       'Speicherlänge vordefinieren, um aus Datei entsprechende anzahl Bytes zu lesen
Get #TFileNum, 1, T1                                 'Ab erster (1) Stelle Daten mit Länge von T1 einlesen

T2 = Space(Lof(TFileNum) - Len(T1))                        'Speicher ebenfalls vordefinieren. Hier wird allerdings von der gesammtlänge der Datei die Länge von T1 abgeschnitten. (REST)
Get #TFileNum, Len(T1) + 1, T2                           'Hier wird die Länge T1 als Startposition verwendet. Da T1 eine länge von 512 hat, muss +1 gerechnet werden, um das "nächste" byte zu erfassen.
                                                'andernfalls hat man noch das letzte byte der 512 als erstes in T2 stehen.

Close #TFileNum                                       'Eingabe schliessen

TFileNum = FreeFile                                    'Eine Freie Dateinummer erzeugen
If Open(TFilePfadNameOut1 for Binary as #TFileNum) <> 0 Then   'wenn Datei nicht geöffnet werden konnte
   Print "konnte datei nicth öffnen! muss beenden!"         'dann fehler ausgeben
   End -1                                          'und programm beenden
End If
Print #TFileNum, T1;                                 'hier wird T1 in die neue Datei geschrieben. Wichtig ist das ; am ende. Alternativ kann dis auch gemacht werden mit (siehe nächstes verfahren für T2)
Close #TFileNum


TFileNum = FreeFile                                    'Eine Freie Dateinummer erzeugen
If Open(TFilePfadNameOut2 for Binary as #TFileNum) <> 0 Then   'wenn Datei nicht geöffnet werden konnte
   Print "konnte datei nicth öffnen! muss beenden!"         'dann fehler ausgeben
   End -1                                          'und programm beenden
End If
Put #TFileNum, 1, T2                                 'hier wird T2 an die erste stelle in die neue Datei mit einem anderem Befehl geschrieben.
Close #TFileNum

Print "erfolgreich"
End 0



MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
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