LabVIEWForum.de - String Array in bin schreiben und lesen EOF

LabVIEWForum.de

Normale Version: String Array in bin schreiben und lesen EOF
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo

Ich versuche gerade ein 3D String Array in eine Binädatei zu schreiben und zu lesen aber scheinbar passt etwas mit der ermittlung der Dateigröße zu passen.
Die Datei wird zwar gelesen aber im Errorcluster ist anch der Funktion "Aus Binärdatei lesen" immer ein Fehler "LabVIEW: Ende der Datei (EOF) festgestellt." Code 4 auf, die datei wird aber dennoch gelesen.
Habe ich da was falsch verstanden, kann ich bei der Funktion "Aus Binärdatei lesen" auch die Anzahl -1 fest angeben?

PS: Die von mir benötigte String-Arraygröße und der Inhalt kann variieren.
Hallo Hansi,

wenn ich das hier ausführe, wird mir (ohne EOF-Fehler) angezeigt, dass das gespeicherte und wieder eingelesene 3D-Array identisch zur Vorlage ist:
[attachment=56527]

Irgendwas scheinst du anders zu machen…
(Wenn du dein VI mal in LV2014 anhängst, könnte ich vielleicht auch sagen, was das wäre!)
Zahl geht, versuche mal ein Stringarray. Wink

Ich denke es liegt daran das man bei String in Array nicht einfach Teilen kann, das wird wohl nur bei Zahlen entsprechend zum Datentyp gehen.
Dennoch verstehe ich nicht wofür es am VI "In Binärdatei schreiben" den Anschluss "Array- oder String-Größe voranstellen?" gibt.
Wenn man diesem beim schreiben verwendet dann müsste doch das "Aus Binärdatei lesen" die Größe erkennen wenn man am Anschluss "Anzahl" ein -1 anlegt.

Da ich aber das in der Deutschen Anleitung gelesen hatte:

"Wenn Sie eine Datei mit Anzahl verbinden, die einen anderen als den 32-Bit-Integer-Datentyp aufweist, passt LabVIEW den Typ entsprechend an. Das heißt, dass das VI unter Umständen nicht die gewünschte Datenmenge liest. Wenn Sie –1 mit Anzahl verbinden und die zu lesende Datei nicht mit einem 32-Bit-Integer dargestellt werden kann, gibt LabVIEW einen Fehler aus."

war ich etwass verwirrt (Eine Datei mit Anzahl verbinden, hä?), anschließend habe ich mir mal die Englische Anleitung angesehen:

"If you wire a file size with a data type other than a 32-bit integer to count, LabVIEW coerces the data type to a 32-bit integer. This means the VI may not read the amount of data you intend. If you wire –1 to count and the size of the file you want to read is too large to be represented by a 32-bit integer, LabVIEW returns an error."

Das ist dann also "Lost in translation" Wink

Ich stelle jetzt einfach mal eine Vermutung auf und hoffe das dies hier jemand bestätigen oder dementieren kann:

Wenn man ein True am Anschluss "Array- oder String-Größe voranstellen?" des "In Binärdatei schreiben" gibt wird die Datengröße am Anfang in die Datei (Header?) geschrieben, wenn man ein -1 am Anschluss "Anzahl" des "Aus Binärdatei lesen" anlegt wird die Dateigröße aus der Datei gelesen und alles ist gut?

Wennich es jetzt so wie im Anhang mache erhalte ich keine Fehlermeldung mehr, bin aber nicht sicher ob es dennoch richtig ist.

Leider ist ist die Hilfe zu Labview sehr oft nicht wirklich eindeutig und die Deutsche übersetzung ist sowieso manchmal sehr fragwürdig. Wink
Ach ja , hatte überlesen das du die Beispiele in V 2014 benötigst.
Anbei eines mit Angabe der Dateigröße und eines mit -1 am Anzahl Eingang.
Hallo Hansi,

Zitat:Dennoch verstehe ich nicht wofür es am VI "In Binärdatei schreiben" den Anschluss "Array- oder String-Größe voranstellen?" gibt.
Damit LabVIEW beim Einlesen des Binärfiles selbständig die Array-/Stringgröße erkennen kann, muss diese natürlich auch in der Datei vorhanden sein: sie wird dann den eigentlichen Daten vorangestellt. Bei einem String halt ein I32 mit der Stringlänge, bei Array pro Dimension ein I32 mit der Dimensionsgröße.

Schau dir deine Binärdatei mal mit einem Hexeditor an: dein 3D-Stringarray mit 2×3×4 Elementen wird durch drei I32-Werte (2,3,4) gleich am Anfang in der Datei signalisiert!

Zitat:Anbei eines mit Angabe der Dateigröße und eines mit -1 am Anzahl Eingang.
Das mit "-1" funktioniert, weil LabVIEW selbständig die Datei analysiert.
Das andere nicht, weil du eine falsche Größenangabe berechnest: wieso teilst du die Dateilänge (133 Bytes) durch 8, um dies als Anzahl der zu lesenden Arrays (!) anzugeben? Da ist doch nur ein 3D-Array in der Datei vorhanden!
Ui ja Wink

"Die Werte können Bytes oder Objekte des angegebenen Datentyps sein." hatte ich dann wohl falsch verstanden.
Ich muss nicht die Bytes angeben sondern die Anzahl der Objekte, in meinem Fall 1 (da es nie mehr als ein Array sein wird) oder mit -1 wird es Analysiert..

Zitat:Das mit "-1" funktioniert, weil LabVIEW selbständig die Datei analysiert.

Und dazu muss aber doch auch beim schreiben das "Array- oder String-Größe voranstellen?" auf True stehen oder bzw. sind doch diese beiden abhängig voneinander?
Also wie ich das sehe ist es dann so, wenn ich beim Lesen die -1 anlege muss beim schreiben der "Größe voranstellen?" Wert auf True stehen, wenn ich einfach eine 1 anlege kann der Wert auf False stehen da ich die Anzahl fest angegeben habe (ist aber auch kein Schden wenn er weiter auf True steht).

Im Bild ist das Beispiel einer Bin Datei, auf Offset 00 04 0nd 08 stehen die 02, 03 und 04 wenn du das damit gemeint hast.
Hallo Hansi,

Zitat:"Die Werte können Bytes oder Objekte des angegebenen Datentyps sein." hatte ich dann wohl falsch verstanden.
Ich muss nicht die Bytes angeben sondern die Anzahl der Objekte,
"Bytes" greift nur, wenn eben nur Bytes gelesen werden sollen. Alles andere sind dann "Objekte" mit zum Teil deutlich mehr Speicherbedarf!
Dein 3D-Array of Strings ist eben auch ein (in Zahlen: 1) Objekt…

Zitat:in meinem Fall 1 (da es nie mehr als ein Array sein wird) oder mit -1 wird es Analysiert..
Die Größenangaben werden immer ausgewertet, wenn du "Objekte" wie dein 3D-Array einlesen willst. Wie soll LabVIEW denn sonst die Größe des Arrays erkennen?
Anders herum: einfach ein 3D-Array of Strings einlesen OHNE entsprechende Größenangaben in der Datei zu haben wird fehlschlagen…

Auf die Größenangaben kann man nur verzichten, wenn man Datentypen verwendet, deren Größe schon während der Programmerstellung bekannt ist: einfache Zahlenwerte (I32, DBL, etc.), einfache Cluster aus Zahlenwerten, Arrays mit genau definierter Größe (z.B. ein 1D-Array aus genau 8 I32-Werten) - aber eben KEINE Strings oder Arrays mit variabler Größe!

Zitat:Im Bild ist das Beispiel einer Bin Datei, auf Offset 00 04 0nd 08 stehen die 02, 03 und 04 wenn du das damit gemeint hast.
Ja, genau die 12 Bytes (= 3× I32) meinte ich…
Zitat:Die Größenangaben werden immer ausgewertet, wenn du "Objekte" wie dein 3D-Array einlesen willst. Wie soll LabVIEW denn sonst die Größe des Arrays erkennen?
Anders herum: einfach ein 3D-Array of Strings einlesen OHNE entsprechende Größenangaben in der Datei zu haben wird fehlschlagen…

Ist dann egal ob ich in meinem Fall (im .Bin ist immer die Größenangabe enthalten) -1 oder 1 anegebe?
Der Anzahl Anschluss hat dann beim Datentyp Array die Bedeutung 1= ein Array (Objekt) und -1 ermittle 1 Array (Objekt) und die Arraygröße selbst wird dann aus der Größenangabe im File ermittelt und demnach würde es bei Array keine Anzahl größer 1 geben?
Hallo Hansi,

Zitat:Der Anzahl Anschluss hat dann beim Datentyp Array die Bedeutung 1= ein Array (Objekt)
Ja.

Zitat: und -1 ermittle 1 Array (Objekt)
Nein: "-1" bedeutet "lese alle Objekte aus der Datei"

Zitat:die Arraygröße selbst wird dann aus der Größenangabe im File ermittelt
Ja.

Zitat:demnach würde es bei Array keine Anzahl größer 1 geben?
Das liegt aber nur daran, dass du eben nur einmal ein Array in der Datei speicherst…
Du könntest ja (theoretisch) auch mehr als nur ein Array in der Datei speichern!
Aah, Licht an. Wink

Herzlichen Dank für die Erklärung und Unterstützung. Smile
Referenz-URLs