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!
|
Verfasst am: 15.10.2012, 20:24 Titel: Problem: Bytes abschneiden, Datei speichern |
|
|
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
(Ich arbeite mit WindowsXP und der neustes Version des Compilers) |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 15.10.2012, 20:29 Titel: |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 15.10.2012, 21:22 Titel: |
|
|
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 |
|
 |
jensma

Anmeldungsdatum: 16.05.2005 Beiträge: 85 Wohnort: Gleich neben Frankfurt, zwei Zimmer neben Lloyd!
|
Verfasst am: 15.10.2012, 22:40 Titel: |
|
|
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.
Tut mir Leid, ich muss es unter Windows machen
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 15.10.2012, 23:06 Titel: |
|
|
jensma hat Folgendes geschrieben: |
Tut mir Leid, ich muss es unter Windows machen  | 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 |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4699 Wohnort: ~/
|
Verfasst am: 15.10.2012, 23:09 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 15.10.2012, 23:10 Titel: |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 15.10.2012, 23:13 Titel: |
|
|
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 |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 15.10.2012, 23:20 Titel: |
|
|
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 |
|
 |
jensma

Anmeldungsdatum: 16.05.2005 Beiträge: 85 Wohnort: Gleich neben Frankfurt, zwei Zimmer neben Lloyd!
|
Verfasst am: 15.10.2012, 23:20 Titel: |
|
|
28398 hat Folgendes geschrieben: | jensma hat Folgendes geschrieben: |
Tut mir Leid, ich muss es unter Windows machen  | 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 In der Firma nutze ich das Gerät sowieso nur als Client für Großrechneranwednungen. Das nur am Rande
Zitat: | variable = SPACE(LOF(1)-512) |
Danke für den Schnipsel! Allerdings ist meine Ausgabedatei jetzt kaputt, prall gefüllt mit Leerzeichen  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 15.10.2012, 23:21 Titel: |
|
|
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 |
|
 |
jensma

Anmeldungsdatum: 16.05.2005 Beiträge: 85 Wohnort: Gleich neben Frankfurt, zwei Zimmer neben Lloyd!
|
Verfasst am: 15.10.2012, 23:26 Titel: |
|
|
Oh super, danke! Jetzt funktioniert es tadellos
Danke für die späte Hilfe, jetzt kann ich beruhigt schlafen ) |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 16.10.2012, 11:06 Titel: |
|
|
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 |
|
 |
|