| 
				
					|  | Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| michaelblasin 
 
 
 Anmeldungsdatum: 09.11.2010
 Beiträge: 38
 
 
 | 
			
				|  Verfasst am: 18.11.2014, 09:14    Titel: Qbasic - Freebasic  Random Dateien |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| RockTheSchock 
 
 
 Anmeldungsdatum: 04.04.2007
 Beiträge: 138
 
 
 | 
			
				|  Verfasst am: 18.11.2014, 10:45    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 18.11.2014, 18:05    Titel: |   |  
				| 
 |  
				| @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 |  |  
		|  |  
		| RockTheSchock 
 
 
 Anmeldungsdatum: 04.04.2007
 Beiträge: 138
 
 
 | 
			
				|  Verfasst am: 19.11.2014, 10:49    Titel: |   |  
				| 
 |  
				| Ich habe da etwas für michaelblasin gebastelt und als private Nachricht geschickt. Mit seiner Erlaubnis veröffentliche ich es hier. |  |  
		| Nach oben |  |  
		|  |  
		| Elor 
 
 
 Anmeldungsdatum: 12.07.2013
 Beiträge: 205
 Wohnort: Konstanz
 
 | 
			
				|  Verfasst am: 19.11.2014, 11:17    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 19.11.2014, 12:13    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| RockTheSchock 
 
 
 Anmeldungsdatum: 04.04.2007
 Beiträge: 138
 
 
 | 
			
				|  Verfasst am: 19.11.2014, 12:43    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| Elor 
 
 
 Anmeldungsdatum: 12.07.2013
 Beiträge: 205
 Wohnort: Konstanz
 
 | 
			
				|  Verfasst am: 19.11.2014, 13:49    Titel: |   |  
				| 
 |  
				|  	  | 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 |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 19.11.2014, 16:05    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 19.11.2014, 16:39    Titel: |   |  
				| 
 |  
				|  	  | 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 |  |  
		|  |  
		| Elor 
 
 
 Anmeldungsdatum: 12.07.2013
 Beiträge: 205
 Wohnort: Konstanz
 
 | 
			
				|  Verfasst am: 19.11.2014, 18:04    Titel: |   |  
				| 
 |  
				| @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 |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 19.11.2014, 18:48    Titel: |   |  
				| 
 |  
				| 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.  _________________
 Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
 |  |  
		| Nach oben |  |  
		|  |  
		| micha 
 
 
 Anmeldungsdatum: 09.12.2005
 Beiträge: 72
 
 
 | 
			
				|  Verfasst am: 19.11.2014, 20:44    Titel: |   |  
				| 
 |  
				| Bist Du Dir da auch ganz sicher ? 	  | 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) | 
 
 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 |  |  
		|  |  
		| RockTheSchock 
 
 
 Anmeldungsdatum: 04.04.2007
 Beiträge: 138
 
 
 | 
			
				|  Verfasst am: 19.11.2014, 21:12    Titel: |   |  
				| 
 |  
				|  	  | 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 |  |  
		|  |  
		| micha 
 
 
 Anmeldungsdatum: 09.12.2005
 Beiträge: 72
 
 
 | 
			
				|  Verfasst am: 20.11.2014, 03:31    Titel: |   |  
				| 
 |  
				| Danke und was ist mit ENUM gcc 64bit Windows / Linux ? 	  | RockTheSchock hat Folgendes geschrieben: |  	  |  	  | Code: |  	  | 32 bit long           4
 integer        4
 | 
  	  | Code: |  	  | 64 bit long           4
 integer        8
 | 
 | 
 
 micha
 |  |  
		| Nach oben |  |  
		|  |  
		| RockTheSchock 
 
 
 Anmeldungsdatum: 04.04.2007
 Beiträge: 138
 
 
 |  |  
		| Nach oben |  |  
		|  |  
		| grindstone 
 
 
 Anmeldungsdatum: 03.10.2010
 Beiträge: 1283
 Wohnort: Ruhrpott
 
 | 
			
				|  Verfasst am: 20.11.2014, 09:30    Titel: |   |  
				| 
 |  
				| Ich fürchte, mein Vorschlag war etwas voreilig, die Sache ist doch etwas komplizierter.   
 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:
 
 Diese Datei stimmt mit der von QB geschriebenen überein. 	  | Code: |  	  | h = ko.text1 + MkShort(ko.zahl) + ko.text2 Open "c:\test.txt" For Output As #1
 Print #1, h;
 Close
 
 | 
 
 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 |  |  
		|  |  
		| RockTheSchock 
 
 
 Anmeldungsdatum: 04.04.2007
 Beiträge: 138
 
 
 | 
			
				|  Verfasst am: 20.11.2014, 10:15    Titel: |   |  
				| 
 |  
				| 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 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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.
 
 |  |