![]() |
Binärdatei Record auslesen\zuweisen
Der record..
Delphi-Quellcode:
Wenn ich die Datei öffne dann ist FileSize = Buffersize, die Bytes die gelesen wurden sind genauso groß.
TSTChannel = record
ID : Integer; streamName : Array [0..250] of AnsiChar; freq : single; volume : single; pan : single; mute : byte; solo : byte; duration : Integer; percent : Integer; grouplevel : single; led : byte; rMeterValue : single; reserved : Array [0..25] of AnsiChar; end; Aber irgendwie bekomme ich nicht die werte die eigentlich zurück geliefert werden müssten. Wenn ich das Array des streamName vergrößere funktioniert so gut wie gar nicht. warum hat das so einen Einfluss? Eigentlich dürfte es doch egal sein wie groß der Speicher für den Namen zugewiesen wird.
Delphi-Quellcode:
streamName : Array [0..MASX_PATH] of AnsiChar;
Wieder so ein Mysterium für mich. gruss |
AW: Binärdatei Record auslesen\zuweisen
Wo kommt die Datei denn her? Schreibst Du die selbst? Hilft es evtl., den Record als packed zu deklarieren?
|
AW: Binärdatei Record auslesen\zuweisen
Zitat:
Ich kenne nur die Definition. Und öffne sie so.
Delphi-Quellcode:
var
Channel: array[1..MAXCHANNEL] of TSTChannel;
Delphi-Quellcode:
Der wert im Channel[1].Volume müsste 50 sein ist er aber nicht.
fHandle := CreateFile(PWideChar(sFile), GENERIC_READ, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (fHandle <> INVALID_HANDLE_VALUE) then begin FillChar(Channel, sizeof(TSTChannel) * MAXCHANNEL, 0); BufferSize := sizeof(TSTChannel) * MAXCHANNEL; FileSize := GetFileSize(fHandle, @FileSize); if (FileSize = INVALID_HANDLE_VALUE) then FileSize := 0; if (FileSize div sizeof(TSTChannel) = 8) then BufferSize := FileSize; if (FileSize < BufferSize) then BufferSize := 0 else bErrorFlag := ReadFile(fHandle, Channel[1], BufferSize, dwBytesReaden, nil); CloseHandle(fHandle); end; gruss |
AW: Binärdatei Record auslesen\zuweisen
Zeig mal etwas Code. Bin mir nicht ganz sicher wo dein Problem liegt.
Wenn du das streamName-Array vergrößert rutschen alle anderen Felder im Array entsprechend viele Bytes nach hinten und nichts ist mehr am richtigen Ort. Woher hast du denn die Record-Definition von TSTChannel? Du hast gesagt du schreibst das Record noch nicht. Wer schreibt es denn und bist du dir sicher, dass deine Record-Definition richtig ist? |
AW: Binärdatei Record auslesen\zuweisen
Zitat:
EDIT: Zitat:
Aber wie gesagt kommen falsche werte an. Wenn ich packed nehme dann ist der Buffersize und Bytesread kleiner wie Filesize. gruss |
AW: Binärdatei Record auslesen\zuweisen
Die Felder des Records liegen im Speicher hintereinander. Wenn Du eines der vorderen Felder - z.B. streamName - vergrößerst, rutscht alles Folgende nach hinten. Das ist schon plausibel.
Die Felder des Array können, müssen aber nicht zwingend /direkt/ hintereinander liegen. Das kannst Du mit dem Thema "Alignment" steuern. Oder eben mit dem Schlüsselwort "packed", dann liegt das Zeugs wirklich dicht an dicht im Speicher. Entscheidend aber ist, dass Du dasselbe Alignment verwendest wie die Software, die die Datei schreibt. Da es letztlich nur 1, 2, 4, und 8 als gängige Möglichkeiten gibt, ist ausprobieren ggf. die schnellste Lösung. |
AW: Binärdatei Record auslesen\zuweisen
Zitat:
Hmm.. kann jetzt aber auch nicht sehen was falsch sein könnte. Die Datei ist von fly-worship 3KB Danke. gruss |
AW: Binärdatei Record auslesen\zuweisen
Ist nicht das eigentliche Problem, aber
Delphi-Quellcode:
solltest du zu
OPEN_ALWAYS
Delphi-Quellcode:
ändern (bei
OPEN_EXISTING
![]() ![]()
Delphi-Quellcode:
auf
INVALID_HANDLE_VALUE
Delphi-Quellcode:
prüfen (ist der selbe Wert, nur nicht so verwirrend beim lesen :P). Den zweiten Parameter kannst du hier auch auf
INVALID_FILE_SIZE
Delphi-Quellcode:
setzen statt
nil
Delphi-Quellcode:
(den Wert überschreibst du ja eh wieder sobald das Resultat der Funktion zugewiesen wird).
@FileSize
Zitat:
Delphi-Quellcode:
, also
{$A1}
Delphi-Quellcode:
?
packed
Edit: Kannst du mal die originale (unveränderte) Definition von
Delphi-Quellcode:
verlinken?
TSTChannel
|
AW: Binärdatei Record auslesen\zuweisen
Zitat:
glaube das hatten wir schon mal. Das andere werde ich ändern Danke.
Code:
EDIT:
TYPE STChannel
ID AS LONG streamName AS ASCIIZ * %MAX_PATH freq AS SINGLE volume AS SINGLE pan AS SINGLE mute AS BYTE solo AS BYTE duration AS LONG percent AS LONG grouplevel AS SINGLE led AS BYTE rMeterValue AS SINGLE reserved AS ASCIIZ * 25 '// Total 320 bytes. END TYPE Geänderte Teil
Delphi-Quellcode:
Hab zwei shots angehängt.
fHandle := CreateFile(PWideChar(sFile), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (fHandle <> INVALID_HANDLE_VALUE) then begin FillChar(Channel, sizeof(TSTChannel) * MAXCHANNEL, 0); BufferSize := sizeof(TSTChannel) * MAXCHANNEL; FileSize := GetFileSize(fHandle, nil); if (FileSize = INVALID_FILE_SIZE) then FileSize := 0; if (FileSize div sizeof(TSTChannel) = 8) then BufferSize := FileSize; if (FileSize < BufferSize) then BufferSize := 0 else bErrorFlag := ReadFile(fHandle, Channel[1], BufferSize, dwBytesReaden, nil); CloseHandle(fHandle); end; Bei Packed ist der ganze Speicher verschoben. gruss |
AW: Binärdatei Record auslesen\zuweisen
PS: das "gute" alte
Delphi-Quellcode:
funktioniert immernoch.
file of TMyRecord
Externe Records NIEMALS pur definiert, sondern ausschließlich PACKED oder mit explizitem
Delphi-Quellcode:
(direkt davor oder über die ganze Datei)
{$ALIGN x}
und
Delphi-Quellcode:
, egal ob Datei, Stream oder sonstwas.
{$ALIGN 1} = PACKED
denn du willst ja nicht, dass sich die Ausrichtugn irgendwann mal ändert und es dann nicht mehr zu deiner Datei passt. Extern = von/nach außerhalb deines Programms. (mit der Ausnahme, dass wenn die Datei/Stream ausschließlich nur von der eigenen EXE geschrieben/gelesen wird und das nicht über Programminstanzen hinweg) AnsiChar war schonmal gut (kann auch für UTF-8 genutzt werden) oder eben WideChar, wegen Unicode. Denn dynamische/compilerabhängige Typen sind auch verboten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz