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:

Qbasic - Freebasic Random Dateien

 
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
michaelblasin



Anmeldungsdatum: 09.11.2010
Beiträge: 38

BeitragVerfasst am: 18.11.2014, 10:14    Titel: Qbasic - Freebasic Random Dateien Antworten mit Zitat

Hallo,

Ich habe eine Random Datei mit einer Satzlaenge von 384, erstellt mit QB.

Auch mit QB64 gibt es keine Probleme beim Lesen oder Schreiben der Datei. Dasgleiche Programm läuft ohne Änderungen.

Der mit TYPE deklarierte Typenname nach TYPE TypenName AS DatenTyp in QBasic und QB64 hat diegleiche Länge des DatenTyps (in meinem konkretem Fall 384).

Aber in FreeBasic ist die Länge 452. Laenge durch LEN(DatenTyp)
Das Ergenis des Lesens ist natürlich ein ziemliches Durcheinander.

Kennt jemand eine Lösung?
Gruss Michael
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 18.11.2014, 11:45    Titel: Antworten mit Zitat

Zeig mal dein Type.
Es gibt mehrere Dinge die Falsch laufen können, weil FreeBasic sich etwas unterscheidet:

Du solltest "Type mit FIELD = 1" verwenden.
http://www.freebasic-portal.de/befehlsreferenz/field-236.html

Integer sind in QB 2-Byte in FB normalerweise 4 manchmal auch 8 Byte je nach Target Plattform (32bit oder 64bit) d.h. nutze in FB
Short-2 Byte
Long 4-Byte
LongInt 8-Byte

Strings fester Länge sind glaube ich ein Byte länger wegen eines NULL Zeichens am Ende.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 18.11.2014, 19:05    Titel: Antworten mit Zitat

@Stringlänge: Richtig, in FreeBASIC werden allen Strings ein Nullbyte angehängt (ähnlich ZSTRING, nur nicht terminierend) zur besseren Kompatibilität mit C-Bibliotheken.

Als Lösung könnte man die Daten durch eine selbst gestrickte Routine auslesen und ggf. neu (in "FB-Format") speichern (siehe BINARY); bietet sich insb. an, wenn die Daten in Zukunft nur noch mit FB verwendet werden sollen - wenn ein zeitgleicher Einsatz von QB geplant ist, wird das natürlich unangenehm.
_________________
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
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 19.11.2014, 11:49    Titel: Antworten mit Zitat

Ich habe da etwas für michaelblasin gebastelt und als private Nachricht geschickt. Mit seiner Erlaubnis veröffentliche ich es hier.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 19.11.2014, 12:17    Titel: Antworten mit Zitat

UDT's, die mit QB erzeugt und als Datensatz gespeichert wurden, koennen in FB einfach als Binaer-Datei gelesen werden.
Code:

Type TMeinTyp
   Deine Datenfelder
End Type

dim as TMeinTyp MeineDaten

' in FB muss jetzt die Datei Binaer geoeffnet werden und die Datensatzposition mit -Datensatznummer * Datensatzlaenge-
' ermittelt werden. Die Datensatzlaenge bezieht sich hier auf die laenge unter QB Eingelesen wird dann so:

Get #DateiHandle, Satzposition, MeineDaten.Datenfeld1
Get #DateiHandle, , MeineDaten.naechstesfeld

' u.s.w

Wenn du das genau so Speicherst, dann kannst du die Datei auch wieder mit QB lesen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 19.11.2014, 13:13    Titel: Antworten mit Zitat

Elor, das Problem mit den unterschiedlichen Stringlängen hast du dabei leider immer noch. Da müsste man dann ggf. noch bei Bedarf mit SEEK den Zeiger verschieben.
_________________
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
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 19.11.2014, 13:43    Titel: Antworten mit Zitat

Ich werde jetzt mal meinen Ansatz kundtun:
Code:
#Macro DeclareProperty(feldname,laenge)
   Declare Property feldname() AS STRING
   Declare Property feldname(new##feldname AS STRING)
   l##feldname(1 To laenge) AS UBYTE
#EndMacro

#Macro AddProperty(typ,feldname)
Property ##typ.##feldname() AS String
   Dim s As String = Space(UBound(l##feldname))
   For i As Integer = 1 To UBound(l##feldname)      
      s[i-1]=l##feldname(i)   
   Next
   
   Return s
End Property

Property ##typ.##feldname(new##feldname as String)   
   For i As Integer = 1 To UBound(l##feldname)
      if i>len(new##feldname) Then Return         
      l##feldname(i)=new##feldname[i-1]
   Next   
End Property
#EndMacro

TYPE StockTyp Field = 1
   DeclareProperty(LagFeldChar,1)
   DeclareProperty(KundenNr,6)
   DeclareProperty(EKReNrJahr,6)
   DeclareProperty(ZugangsArt,1)
   DeclareProperty(EKReNr,6)
   DeclareProperty(PalettenNr,8)
   DeclareProperty(AuftragNrJahr,6)
   DeclareProperty(AuftragNr,6)
   DeclareProperty(ZeilenNr,4)
   DeclareProperty(UnterZeilenNr,2)
   DeclareProperty(WaKategory,3)
   DeclareProperty(Matname,20)
   MatDateiNr AS Short
   
   DeclareProperty(MatQualitaet,1)
   DeclareProperty(Matkode,6)
   DeclareProperty(FliesFase,3)
   DeclareProperty(Politur,3)
   DeclareProperty(OberflaecheChemie,3)
   DeclareProperty(OberflaecheSchnitt,3)
   DeclareProperty(PoliturRueckseite,3)
   DeclareProperty(PackingKode,3)
   DeclareProperty(PackPalKode,3)
   DeclareProperty(PackKartKode,3)
   DeclareProperty(Wendel,1)
   DeclareProperty(Laenge,4)
   DeclareProperty(Breite,4)
   DeclareProperty(Hoehe,4)
   DeclareProperty(LaengeDispo,4)
   DeclareProperty(BreiteDispo,4)
   DeclareProperty(HoeheDispo,4)
   DeclareProperty(LaengeVon,4)
   DeclareProperty(LaengeBis,4)
   DeclareProperty(KantenArt1,3)
   DeclareProperty(PoliturKante1,3)
   DeclareProperty(KantenSeiten1,4)
   DeclareProperty(Widerkehr1,1)
   DeclareProperty(KantenKopfLaenge1L,3)
   DeclareProperty(KantenKopfLaenge1R,3)
   DeclareProperty(KantenArt2,3)
   DeclareProperty(PoliturKante2,3)
   DeclareProperty(KantenSeiten2,4)
   DeclareProperty(Widerkehr2,1)
   DeclareProperty(KantenKopfLaenge2L,3)
   DeclareProperty(KantenKopfLaenge2R,3)
   DeclareProperty(KantenArt3,3)
   DeclareProperty(PoliturKante3,3)
   DeclareProperty(KantenSeiten3,4)
   DeclareProperty(Widerkehr3,1)
   DeclareProperty(KantenKopfLaenge3L,3)
   DeclareProperty(KantenKopfLaenge3R,3)
   DeclareProperty(ArtWassernase,3)
   DeclareProperty(WassernaseSeiten,4)
   DeclareProperty(WassernaseKopfLaengeL,3)
   DeclareProperty(WassernaseKopfLaengeR,3)
   DeclareProperty(ArtRutschstreifen,3)
   DeclareProperty(RutschstreifenSeiten,4)
   DeclareProperty(RutschstreifenBreite,3)
   DeclareProperty(RutschstreifenAbstand,3)
   DeclareProperty(RutschstreifenAbstandLinks,3)
   DeclareProperty(RutschstreifenAbstandRechts,3)
   DeclareProperty(RutschstreifenKopfLaengeL,3)
   DeclareProperty(RutschstreifenBreiteL,3)
   DeclareProperty(RutschstreifenAbstandL,3)
   DeclareProperty(RutschstreifenKopfLaengeR,3)
   DeclareProperty(RutschstreifenBreiteR,3)
   DeclareProperty(RutschstreifenAbstandR,3)

   DeclareProperty(LagerPlatz,10)
   DeclareProperty(EkReAuftragVergleich,1)

   InventurMenge AS LONG
   InventurWert AS DOUBLE
   InventurAbgangMenge AS LONG
   InventurAbgangWert AS DOUBLE
   LagerZugang AS LONG
   LagerZugangWert AS DOUBLE
   LagerAbgang AS LONG
   LagerAbgangWert AS DOUBLE
   LagerMindestMenge AS LONG
   KundenLagerBestellung AS LONG
   KundenLagerBestellungWert AS DOUBLE
   KundenAuftragBestellung AS LONG
   KundenAuftragBestellungWert AS DOUBLE
   LiefLagerBestellung AS LONG
   LiefLagerBestellungWert AS DOUBLE
   LiefAuftragBestellung AS LONG
   LiefAuftragBestellungWert AS DOUBLE
   LiefLagerUnterwegs AS LONG
   LiefLagerUnterwegsWert AS DOUBLE
   LiefAuftragUnterwegs AS LONG
   LiefAuftragUnterwegsWert AS DOUBLE

   GRLAGSTMenge AS LONG
   
   DeclareProperty(LeerFeld,9)
END TYPE


AddProperty(StockTyp,LagFeldChar)
AddProperty(StockTyp,KundenNr)
AddProperty(StockTyp,ZugangsArt)
AddProperty(StockTyp,EKReNrJahr)
AddProperty(StockTyp,EKReNr)
AddProperty(StockTyp,PalettenNr)
AddProperty(StockTyp,AuftragNrJahr)
AddProperty(StockTyp,AuftragNr)
AddProperty(StockTyp,ZeilenNr)
AddProperty(StockTyp,UnterZeilenNr)
AddProperty(StockTyp,WaKategory)
AddProperty(StockTyp,Matname)
AddProperty(StockTyp,MatQualitaet)
AddProperty(StockTyp,Matkode)
AddProperty(StockTyp,FliesFase)
AddProperty(StockTyp,Politur)
AddProperty(StockTyp,OberflaecheChemie)
AddProperty(StockTyp,OberflaecheSchnitt)
AddProperty(StockTyp,PoliturRueckseite)
AddProperty(StockTyp,PackingKode)
AddProperty(StockTyp,PackPalKode)
AddProperty(StockTyp,PackKartKode)
AddProperty(StockTyp,Wendel)
AddProperty(StockTyp,Laenge)
AddProperty(StockTyp,Breite)
AddProperty(StockTyp,Hoehe)
AddProperty(StockTyp,LaengeDispo)
AddProperty(StockTyp,BreiteDispo)
AddProperty(StockTyp,HoeheDispo)
AddProperty(StockTyp,LaengeVon)
AddProperty(StockTyp,LaengeBis)
AddProperty(StockTyp,KantenArt1)
AddProperty(StockTyp,PoliturKante1)
AddProperty(StockTyp,KantenSeiten1)
AddProperty(StockTyp,Widerkehr1)
AddProperty(StockTyp,KantenKopfLaenge1L)
AddProperty(StockTyp,KantenKopfLaenge1R)
AddProperty(StockTyp,KantenArt2)
AddProperty(StockTyp,PoliturKante2)
AddProperty(StockTyp,KantenSeiten2)
AddProperty(StockTyp,Widerkehr2)
AddProperty(StockTyp,KantenKopfLaenge2L)
AddProperty(StockTyp,KantenKopfLaenge2R)
AddProperty(StockTyp,KantenArt3)
AddProperty(StockTyp,PoliturKante3)
AddProperty(StockTyp,KantenSeiten3)
AddProperty(StockTyp,Widerkehr3)
AddProperty(StockTyp,KantenKopfLaenge3L)
AddProperty(StockTyp,KantenKopfLaenge3R)
AddProperty(StockTyp,ArtWassernase)
AddProperty(StockTyp,WassernaseSeiten)
AddProperty(StockTyp,WassernaseKopfLaengeL)
AddProperty(StockTyp,WassernaseKopfLaengeR)
AddProperty(StockTyp,ArtRutschstreifen)
AddProperty(StockTyp,RutschstreifenSeiten)
AddProperty(StockTyp,RutschstreifenBreite)
AddProperty(StockTyp,RutschstreifenAbstand)
AddProperty(StockTyp,RutschstreifenAbstandLinks)
AddProperty(StockTyp,RutschstreifenAbstandRechts)
AddProperty(StockTyp,RutschstreifenKopfLaengeL)
AddProperty(StockTyp,RutschstreifenBreiteL)
AddProperty(StockTyp,RutschstreifenAbstandL)
AddProperty(StockTyp,RutschstreifenKopfLaengeR)
AddProperty(StockTyp,RutschstreifenBreiteR)
AddProperty(StockTyp,RutschstreifenAbstandR)
AddProperty(StockTyp,LagerPlatz)
AddProperty(StockTyp,EkReAuftragVergleich)
AddProperty(StockTyp,LeerFeld)


'### Hauptprogramm #######
Dim StockKode AS StockTyp
Print Len(StockKode)
StockKode.LagFeldChar = "Hallo"
Print StockKode.LagFeldChar


StockKode.LeerFeld = "abcd"
Print StockKode.LeerFeld

sleep
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 19.11.2014, 14:49    Titel: Antworten mit Zitat

Zitat:

Elor, das Problem mit den unterschiedlichen Stringlängen hast du dabei leider immer noch. Da müsste man dann ggf. noch bei Bedarf mit SEEK den Zeiger verschieben.


@nemored:
Das ist so nicht ganz richtig, da bei einem UDT die Stringlaenge immer angegeben ist. Diese angegebene Stringlaenge stellt beim lesen oder
Schreiben in/aus Binaerdateien einen Lese/Schreibpuffer dar. Der Dateizeiger wird dabei Automatisch auf den naechten Feldeintrag gesetzt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 19.11.2014, 17:05    Titel: Antworten mit Zitat

Hallo michaelblasin!

Das einfachste dürfte sein, in der FB-Version des Programms die Datentypen innerhalb des UDT so anzupassen, daß der Speicherbedarf mit dem von QB übereinstimmt. Also Integer wird zu Short, String*10 wird zu ZString*10 (bzw. alternativ: String*10 wird zu String*9). Die nutzbare Länge der Strings vermindert sich dann zwar um 1 Zeichen, aber die Datei kann -sowohl lesend als auch schreibend- unverändert weiterbenutzt werden.

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
nemored



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

BeitragVerfasst am: 19.11.2014, 17:39    Titel: Antworten mit Zitat

Zitat:
@nemored:
Das ist so nicht ganz richtig, da bei einem UDT die Stringlaenge immer angegeben ist. Diese angegebene Stringlaenge stellt beim lesen oder
Schreiben in/aus Binaerdateien einen Lese/Schreibpuffer dar. Der Dateizeiger wird dabei Automatisch auf den naechten Feldeintrag gesetzt.

Nichtsdestotrotz erwartet QB bei einem STRING*10 einen 10 Byte langen Eintrag, FB dagegen einen 11 Byte langen Eintrag. FB setzt damit beim automatischen Weiterrücken um ein Byte weiter als es QB tut (vgl. auch grindstones Posting).
_________________
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
Elor



Anmeldungsdatum: 12.07.2013
Beiträge: 205
Wohnort: Konstanz

BeitragVerfasst am: 19.11.2014, 19:04    Titel: Antworten mit Zitat

@nemored: Wenn unter FB ein UDT erstellt wird, wird nach einem STRING-Feld ein leerzeichen eingefuehgt. Bei verwendung in RANDOM-
Dateien verlangt FB nach diesem Zeichen, soweit sind wir doch einer Meinung.
Wenn aber einzellne Felder des UDT's verwendet werden, z.B. um Daten von einer mit QB erstellten RANDOM-Datei zu lesen, dann ist es FB egal ob
nach dem String-Feld ein 0Byte im UDT steht. Wenn dieses Feld mit 20 Zeichen Deklariert wurde, dann werden auch nur 20 Byte eingelesen.
Da in QB aber kein zusatzbyte verwendet wird, zeigt der Dateizeiger Automatisch auf das erste Zeichen des naechsten Feldes. Ich hab das schon
x-mal so gemacht und hat immer sehr gut Funktioniert.
Aber.. Wenn es einen nicht stoert das da an einem Stringende ein Zeichen fehlen kann, ist die Variante von grindstone besser als meine weil sich ein
QB-Programm viel schneller und einfacher auf FB umstellen laesst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 19.11.2014, 19:48    Titel: Antworten mit Zitat

Ich habe das nochmal getestet; scheinbar hatte ich da was falsch in Erinnerung. Wir hatten vor einigen Monaten eine sehr ähnliche Fragestellung, bei der dieses einzelne Einlesen nicht funktionierte, aber möglicherweise scheiterte das wegen etwas ganz anderem. Wie auch immer, ich ziehe meine obige Aussage zurück und behaupte vorerst einmal das Gegenteil. happy
_________________
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
micha



Anmeldungsdatum: 09.12.2005
Beiträge: 72

BeitragVerfasst am: 19.11.2014, 21:44    Titel: Antworten mit Zitat

RockTheSchock hat Folgendes geschrieben:
Integer sind in QB 2-Byte in FB normalerweise 4 manchmal auch 8 Byte je nach Target Plattform (32bit oder 64bit)
Bist Du Dir da auch ganz sicher ?

Ich dachte immer:
FreeBASIC Integer und Long ist 4 byte unter Win32/Win64 und Linux_X86.
FreeBASIC Long und Enum ist 8 byte aber nur unter Linux_x86_64
Also nur unter 64bit Linux ändert sich etwas bei FreeBASIC.
Natürlich sind Zeiger/Pointer entweder 32 oder 64 bit breit.

micha
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 19.11.2014, 22:12    Titel: Antworten mit Zitat

Zitat:
Bist Du Dir da auch ganz sicher ?

Jetzt ja! Es gab da eine lange Diskussion drüber, wobei letztlich Integer als Standard Datentyp ausgewählt wurde, dessen Länge mit der Plattform wechselt, analog zu QB 16bit / FB 32bit.

Ein kleiner Test:

Code:
FreeBASIC 1.00.0            gcc           32 bit

SizeOf:
byte           1
short          2
long           4
longint        8
integer        4
any ptr        4
String         12



Code:
FreeBASIC 1.00.0            gcc           64 bit

SizeOf:
byte           1
short          2
long           4
longint        8
integer        8
any ptr        8
String         24
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
micha



Anmeldungsdatum: 09.12.2005
Beiträge: 72

BeitragVerfasst am: 20.11.2014, 04:31    Titel: Antworten mit Zitat

RockTheSchock hat Folgendes geschrieben:
Code:
32 bit
long           4
integer        4
Code:
64 bit
long           4
integer        8
Danke und was ist mit ENUM gcc 64bit Windows / Linux ?

micha
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 20.11.2014, 10:12    Titel: Antworten mit Zitat

Da stehts nochmal in voller Länge mit Erklärung:
http://www.freebasic.net/forum/viewtopic.php?f=3&t=22925&p=201246&hilit=Integer+size#p201246

http://www.freebasic.net/wiki/TblVarTypes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 20.11.2014, 10:30    Titel: Antworten mit Zitat

Ich fürchte, mein Vorschlag war etwas voreilig, die Sache ist doch etwas komplizierter. traurig

Zum Vergleich zwei kleine Testprogramme, zunächst für FB:
Code:
Type tkomm
  text1 As String *10
  zahl As Short
  text2 As String *10
End Type

Dim ko As tkomm
Dim As String h
ko.text1 = "abcdefghijklmno"
ko.zahl = -1
ko.text2 = "abcdefghijklmno"
Kill "c:\test.txt"
Open "c:\test.txt" For Binary As #1
Put #1,, ko
Close 1
Open "c:\test.txt" For Binary As #1
Print Lof(1)
Print SizeOf(ko)

h = Input(Lof(1),#1)
For x As Integer = 0 To Len(h)-1
   Print h[x];" ";
Next
Close
Sleep
End

und dann das gleiche noch einmal für QB:
Code:
TYPE tkomm
  text1 AS STRING * 10
  zahl AS INTEGER
  text2 AS STRING * 10
END TYPE

DIM ko AS tkomm

KILL "c:\test.txt"
CLS
ko.text1 = "abcdefghijklmno"
ko.zahl = -1
ko.text2 = "abcdefghijklmno"
OPEN "c:\test.txt" FOR BINARY AS #1
PUT #1, , ko
CLOSE 1
OPEN "c:\test.txt" FOR BINARY AS #1
PRINT LOF(1)
h$ = INPUT$(LOF(1), #1)
FOR x% = 1 TO LEN(h$)
   PRINT ASC(MID$(h$, x%, 1)); " ";
NEXT
CLOSE
SLEEP
END


Wie man sieht, hängt FB an jeden String noch zwei Nullbytes an. Als Lösung sehe ich da nur die Möglichkeit, die Datei als Binary zu öffnen, jeweils einen Datensatz als String passender Länge einzulesen und diesen dann "zu Fuß" in die passenden Variablen umzuwandeln, etwa in dieser Art (die Datei "Test.txt" ist die, welche von QB angelegt wurde):
Code:
Type tkomm
  text1 As String *10
  zahl As Short
  text2 As String *10
End Type

Dim ko As tkomm
Dim As String h

Open "c:\test.txt" For Binary As #1
h = Input(22,#1) 'datensatzlänge von QB

ko.text1 = Mid(h,1,10) 'text1 isolieren
ko.zahl = CVShort(Mid(h,11,2)) '2-byte-string in short-zahl umwandeln
ko.text2 = Mid(h,13,10) ' text2 isolieren

Print ko.text1
Print ko.zahl
Print ko.text2

Close
Sleep
End

Umgekehrt (wenn man das Dateiformat beibehalten möchte) geht das natürlich auch:
Code:
h = ko.text1 + MkShort(ko.zahl) + ko.text2
Open "c:\test.txt" For Output As #1
Print #1, h;
Close
Diese Datei stimmt mit der von QB geschriebenen überein.

Gruß
grindstone

EDIT: Alternativ kann man auch jede Variable des UDT einzeln aus der Datei einlesen (in der richtigen Reihenfolge):
Code:
Type tkomm
  text1 As String *10
  zahl As Short
  text2 As String *10
End Type

Dim ko As tkomm

Open "c:\test.txt" For Input As #1
Get #1,,ko.text1
Get #1,,ko.zahl
Get #1,,ko.text2

Print ko.text1
Print ko.zahl
Print ko.text2
Sleep

_________________
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
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 20.11.2014, 11:15    Titel: Antworten mit Zitat

Wenn du alle Felder einzeln liest bzw. speicherst geht es. Du musst dich halt für eine Methode entscheiden:

- Datei einlesen jedes Feld einzeln und im neuen FB Format als ganze Datensätze in neuer Datei speichern. Dann bleibt dein Programm schön kompakt. Zum Einlesen kannst du die Laden Routine von unten verwenden. Dann kannst du dein QB Programm nicht mehr parallel verwenden!
- Die Speicherlänge der einzelnen Felder von Strings mit ByteArrays simulieren und den Zugriff auf diese Felder per Properties regeln. (siehe mein Beispiel oben)
- Die Datei Routinen zum Lesen / Speichern einzelner Datensätze anpassen, indem die Felder alle einzeln gelesen/geschrieben werden. Dazu ein Beispiel:


'Test14.bas
Code:
Const StockTypSize = 384

TYPE StockTyp Field = 1   
   Declare Sub Speichern(dateiname As String,datensatz As Integer)
   Declare Sub Laden(dateiname As String,datensatz As Integer)
   
   

   LagFeldChar AS STRING * 1
   KundenNr AS STRING * 6
   EKReNrJahr AS STRING * 6
   ZugangsArt AS STRING * 1
   EKReNr AS STRING * 6
   PalettenNr AS STRING * 8
   AuftragNrJahr AS STRING * 6
   AuftragNr AS STRING * 6
   ZeilenNr AS STRING * 4
   UnterZeilenNr AS STRING * 2
   WaKategory AS STRING * 3
   Matname AS STRING * 20
   MatDateiNr AS SHORT
   MatQualitaet AS STRING * 1
   Matkode AS STRING * 6
   FliesFase AS STRING * 3
   Politur AS STRING * 3
   OberflaecheChemie AS STRING * 3
   OberflaecheSchnitt AS STRING * 3
   PoliturRueckseite AS STRING * 3
   PackingKode AS STRING * 3
   PackPalKode AS STRING * 3
   PackKartKode AS STRING * 3
   Wendel AS STRING * 1
   Laenge AS STRING * 4
   Breite AS STRING * 4
   Hoehe AS STRING * 4
   LaengeDispo AS STRING * 4
   BreiteDispo AS STRING * 4
   HoeheDispo AS STRING * 4
   LaengeVon AS STRING * 4
   LaengeBis AS STRING * 4
   KantenArt1 AS STRING * 3
   PoliturKante1 AS STRING * 3
   KantenSeiten1 AS STRING * 4
   Widerkehr1 AS STRING * 1
   KantenKopfLaenge1L AS STRING * 3
   KantenKopfLaenge1R AS STRING * 3
   KantenArt2 AS STRING * 3
   PoliturKante2 AS STRING * 3
   KantenSeiten2 AS STRING * 4
   Widerkehr2 AS STRING * 1
   KantenKopfLaenge2L AS STRING * 3
   KantenKopfLaenge2R AS STRING * 3
   KantenArt3 AS STRING * 3
   PoliturKante3 AS STRING * 3
   KantenSeiten3 AS STRING * 4
   Widerkehr3 AS STRING * 1
   KantenKopfLaenge3L AS STRING * 3
   KantenKopfLaenge3R AS STRING * 3
   ArtWassernase AS STRING * 3
   WassernaseSeiten AS STRING * 4
   WassernaseKopfLaengeL AS STRING * 3
   WassernaseKopfLaengeR AS STRING * 3
   ArtRutschstreifen AS STRING * 3
   RutschstreifenSeiten AS STRING * 4
   RutschstreifenBreite AS STRING * 3
   RutschstreifenAbstand AS STRING * 3
   RutschstreifenAbstandLinks AS STRING * 3
   RutschstreifenAbstandRechts AS STRING * 3
   RutschstreifenKopfLaengeL AS STRING * 3
   RutschstreifenBreiteL AS STRING * 3
   RutschstreifenAbstandL AS STRING * 3
   RutschstreifenKopfLaengeR AS STRING * 3
   RutschstreifenBreiteR AS STRING * 3
   RutschstreifenAbstandR AS STRING * 3

   LagerPlatz AS STRING * 10
   EkReAuftragVergleich AS STRING * 1

   InventurMenge AS LONG
   InventurWert AS DOUBLE
   InventurAbgangMenge AS LONG
   InventurAbgangWert AS DOUBLE
   LagerZugang AS LONG
   LagerZugangWert AS DOUBLE
   LagerAbgang AS LONG
   LagerAbgangWert AS DOUBLE
   LagerMindestMenge AS LONG
   KundenLagerBestellung AS LONG
   KundenLagerBestellungWert AS DOUBLE
   KundenAuftragBestellung AS LONG
   KundenAuftragBestellungWert AS DOUBLE
   LiefLagerBestellung AS LONG
   LiefLagerBestellungWert AS DOUBLE
   LiefAuftragBestellung AS LONG
   LiefAuftragBestellungWert AS DOUBLE
   LiefLagerUnterwegs AS LONG
   LiefLagerUnterwegsWert AS DOUBLE
   LiefAuftragUnterwegs AS LONG
   LiefAuftragUnterwegsWert AS DOUBLE

   GRLAGSTMenge AS LONG
   LeerFeld AS STRING * 9
END Type


Sub StockTyp.Speichern(dateiname As String,datensatz As Integer)
   Dim As Integer datei
   Dim As LongInt start
   
   start = datensatz*StockTypSize+1   
   
   datei = FreeFile
   Open dateiname For Binary Access Write As datei
      
   Print "Speichern",dateiname, datensatz
   
   
   PUT #datei,start,LagFeldChar
   PUT #datei,,KundenNr
   PUT #datei,,EKReNrJahr
   PUT #datei,,ZugangsArt
   PUT #datei,,EKReNr
   PUT #datei,,PalettenNr
   PUT #datei,,AuftragNrJahr
   PUT #datei,,AuftragNr
   PUT #datei,,ZeilenNr
   PUT #datei,,UnterZeilenNr
   PUT #datei,,WaKategory
   PUT #datei,,Matname
   PUT #datei,,MatDateiNr
   PUT #datei,,MatQualitaet
   PUT #datei,,Matkode
   PUT #datei,,FliesFase
   PUT #datei,,Politur
   PUT #datei,,OberflaecheChemie
   PUT #datei,,OberflaecheSchnitt
   PUT #datei,,PoliturRueckseite
   PUT #datei,,PackingKode
   PUT #datei,,PackPalKode
   PUT #datei,,PackKartKode
   PUT #datei,,Wendel
   PUT #datei,,Laenge
   PUT #datei,,Breite
   PUT #datei,,Hoehe
   PUT #datei,,LaengeDispo
   PUT #datei,,BreiteDispo
   PUT #datei,,HoeheDispo
   PUT #datei,,LaengeVon
   PUT #datei,,LaengeBis
   PUT #datei,,KantenArt1
   PUT #datei,,PoliturKante1
   PUT #datei,,KantenSeiten1
   PUT #datei,,Widerkehr1
   PUT #datei,,KantenKopfLaenge1L
   PUT #datei,,KantenKopfLaenge1R
   PUT #datei,,KantenArt2
   PUT #datei,,PoliturKante2
   PUT #datei,,KantenSeiten2
   PUT #datei,,Widerkehr2
   PUT #datei,,KantenKopfLaenge2L
   PUT #datei,,KantenKopfLaenge2R
   PUT #datei,,KantenArt3
   PUT #datei,,PoliturKante3
   PUT #datei,,KantenSeiten3
   PUT #datei,,Widerkehr3
   PUT #datei,,KantenKopfLaenge3L
   PUT #datei,,KantenKopfLaenge3R
   PUT #datei,,ArtWassernase
   PUT #datei,,WassernaseSeiten
   PUT #datei,,WassernaseKopfLaengeL
   PUT #datei,,WassernaseKopfLaengeR
   PUT #datei,,ArtRutschstreifen
   PUT #datei,,RutschstreifenSeiten
   PUT #datei,,RutschstreifenBreite
   PUT #datei,,RutschstreifenAbstand
   PUT #datei,,RutschstreifenAbstandLinks
   PUT #datei,,RutschstreifenAbstandRechts
   PUT #datei,,RutschstreifenKopfLaengeL
   PUT #datei,,RutschstreifenBreiteL
   PUT #datei,,RutschstreifenAbstandL
   PUT #datei,,RutschstreifenKopfLaengeR
   PUT #datei,,RutschstreifenBreiteR
   PUT #datei,,RutschstreifenAbstandR

   PUT #datei,,LagerPlatz
   PUT #datei,,EkReAuftragVergleich

   PUT #datei,,InventurMenge
   PUT #datei,,InventurWert
   PUT #datei,,InventurAbgangMenge
   PUT #datei,,InventurAbgangWert
   PUT #datei,,LagerZugang
   PUT #datei,,LagerZugangWert
   PUT #datei,,LagerAbgang
   PUT #datei,,LagerAbgangWert
   PUT #datei,,LagerMindestMenge
   PUT #datei,,KundenLagerBestellung
   PUT #datei,,KundenLagerBestellungWert
   PUT #datei,,KundenAuftragBestellung
   PUT #datei,,KundenAuftragBestellungWert
   PUT #datei,,LiefLagerBestellung
   PUT #datei,,LiefLagerBestellungWert
   PUT #datei,,LiefAuftragBestellung
   PUT #datei,,LiefAuftragBestellungWert
   PUT #datei,,LiefLagerUnterwegs
   PUT #datei,,LiefLagerUnterwegsWert
   PUT #datei,,LiefAuftragUnterwegs
   PUT #datei,,LiefAuftragUnterwegsWert

   PUT #datei,,GRLAGSTMenge
   PUT #datei,,LeerFeld
      
   Close datei   
End Sub



Sub StockTyp.Laden(dateiname As String,datensatz As Integer)
   Dim As Integer datei
   Dim As LongInt start, ende
   
   start = datensatz*StockTypSize+1
   ende = start+StockTypSize
   
   datei = FreeFile
   Open dateiname For Binary Access Read As datei
   
   
   If ende>Lof(datei) Then
      Print "Datei enthält weniger Datensätze:"
      Close datei
      Return
   EndIf
      
   
   Print "Laden",dateiname, datensatz   
      
   GET #datei,start,LagFeldChar
   GET #datei,,KundenNr
   GET #datei,,EKReNrJahr
   GET #datei,,ZugangsArt
   GET #datei,,EKReNr
   GET #datei,,PalettenNr
   GET #datei,,AuftragNrJahr
   GET #datei,,AuftragNr
   GET #datei,,ZeilenNr
   GET #datei,,UnterZeilenNr
   GET #datei,,WaKategory
   GET #datei,,Matname
   GET #datei,,MatDateiNr
   GET #datei,,MatQualitaet
   GET #datei,,Matkode
   GET #datei,,FliesFase
   GET #datei,,Politur
   GET #datei,,OberflaecheChemie
   GET #datei,,OberflaecheSchnitt
   GET #datei,,PoliturRueckseite
   GET #datei,,PackingKode
   GET #datei,,PackPalKode
   GET #datei,,PackKartKode
   GET #datei,,Wendel
   GET #datei,,Laenge
   GET #datei,,Breite
   GET #datei,,Hoehe
   GET #datei,,LaengeDispo
   GET #datei,,BreiteDispo
   GET #datei,,HoeheDispo
   GET #datei,,LaengeVon
   GET #datei,,LaengeBis
   GET #datei,,KantenArt1
   GET #datei,,PoliturKante1
   GET #datei,,KantenSeiten1
   GET #datei,,Widerkehr1
   GET #datei,,KantenKopfLaenge1L
   GET #datei,,KantenKopfLaenge1R
   GET #datei,,KantenArt2
   GET #datei,,PoliturKante2
   GET #datei,,KantenSeiten2
   GET #datei,,Widerkehr2
   GET #datei,,KantenKopfLaenge2L
   GET #datei,,KantenKopfLaenge2R
   GET #datei,,KantenArt3
   GET #datei,,PoliturKante3
   GET #datei,,KantenSeiten3
   GET #datei,,Widerkehr3
   GET #datei,,KantenKopfLaenge3L
   GET #datei,,KantenKopfLaenge3R
   GET #datei,,ArtWassernase
   GET #datei,,WassernaseSeiten
   GET #datei,,WassernaseKopfLaengeL
   GET #datei,,WassernaseKopfLaengeR
   GET #datei,,ArtRutschstreifen
   GET #datei,,RutschstreifenSeiten
   GET #datei,,RutschstreifenBreite
   GET #datei,,RutschstreifenAbstand
   GET #datei,,RutschstreifenAbstandLinks
   GET #datei,,RutschstreifenAbstandRechts
   GET #datei,,RutschstreifenKopfLaengeL
   GET #datei,,RutschstreifenBreiteL
   GET #datei,,RutschstreifenAbstandL
   GET #datei,,RutschstreifenKopfLaengeR
   GET #datei,,RutschstreifenBreiteR
   GET #datei,,RutschstreifenAbstandR

   GET #datei,,LagerPlatz
   GET #datei,,EkReAuftragVergleich

   GET #datei,,InventurMenge
   GET #datei,,InventurWert
   GET #datei,,InventurAbgangMenge
   GET #datei,,InventurAbgangWert
   GET #datei,,LagerZugang
   GET #datei,,LagerZugangWert
   GET #datei,,LagerAbgang
   GET #datei,,LagerAbgangWert
   GET #datei,,LagerMindestMenge
   GET #datei,,KundenLagerBestellung
   GET #datei,,KundenLagerBestellungWert
   GET #datei,,KundenAuftragBestellung
   GET #datei,,KundenAuftragBestellungWert
   GET #datei,,LiefLagerBestellung
   GET #datei,,LiefLagerBestellungWert
   GET #datei,,LiefAuftragBestellung
   GET #datei,,LiefAuftragBestellungWert
   GET #datei,,LiefLagerUnterwegs
   GET #datei,,LiefLagerUnterwegsWert
   GET #datei,,LiefAuftragUnterwegs
   GET #datei,,LiefAuftragUnterwegsWert

   GET #datei,,GRLAGSTMenge
   GET #datei,,LeerFeld
   
   
   Close datei   
End Sub

DIM StockKode AS StockTyp

Cls
StockKode.Laden "Test14.bas",0
StockKode.Speichern "Test14c.bas",0
Print
StockKode.Laden "Test14.bas",1
StockKode.Speichern "Test14c.bas",1
Print
Print StockKode.LagFeldChar

Sleep
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