Seite 1 von 5

Put# und Get# in Pure Basic

Verfasst: 29.07.2009 11:49
von mikstart
Hallo an all,

stehe schon vor dem nächsten problem. in q basic gibt es get# und put# um daten zu schreiben und lesen.

nun hab ich mal in die hilfe geschaut und finde da folgende befehle openfile, create file, write un read in verschieden formen.

nun ich möchte einen datensatz von nr 100 bis 900 schreiben und der inhalt sollte

name$, Preis (###.##) , stück (integer)

beim preis konnte ich mit den using befehl in qbasic arbeiten.

nun hab ich versucht:

Code: Alles auswählen

eingabe$""
For nr = 100 To 900
CreateFile(nr, "daten.txt")
WriteStringN(nr, eingabe$)
CloseFile(nr)
Next nr
das, dass falsch ist weis ich den wo nr ist ist nicht die datensatznummer.

wie kann ich das defenieren datensatznummer, integer, unsw?
gibt es in pure basic auch den befehl wo man $ zur zahl und umgekehrt zuweisen kann?

gruß mik

Verfasst: 29.07.2009 12:24
von STARGÅTE
Str() wandelt eine Zahl in eine Zeichenkette um
StrF() macht das gleiche aber mit fließkommazahlen
Val() macht aus einer Zeichenkette eine Zahl
ValF() macht das gleiche aber in eine fließkommazahl

Kannst du mal bitte genauer erklären was du mit Datensatz meinst ?

Wenn du mit Dateien arbeitest meist du dann die Zeile oder was ?
Oder willst du n Datenbank machen dann wäre die File-Befehle aber falsch?

Dein Code wie er da steht würde nun 800 mal die Datei daten.txt erzeugen, obei die vorgänger immer wieder gelöscht werden.

Verfasst: 29.07.2009 12:25
von Josef Sniatecki
In deinem Code versuchst du eine Datei 800 Mal zu erstellen.

Du musst das CreateFile und CloseFile außerhalb der For-Schleife setzen:

Code: Alles auswählen

CreateFile(0, "Datei.txt")
For Index = 100 To 900
  WriteStringN(0, Text$)
Next
CloseFile(0)
Nun musst du natürlich innerhalb der Schleife entscheiden, welchen Inhalt "Text$" besitzt.

Eine Nummer machst du durch "Str" in einen String. (Für Kommazahlen/Floats nutzt du "StrF")

Und wenn du einen String in eine Zahl umwandeln willst, dann nutze "Val".

EDIT: Mist... naja, ich versteh auch nicht genau was er meint :)

Verfasst: 29.07.2009 12:29
von Rokur
Du Erstellst in deinem Code immer wieder die gleiche Datei pro Schleifendurchlauf (die alte wird dabei jedesmal gelöscht), also kann das garnicht funktionieren. Allerdings verwendest du jedesmal eine neue Dateinummer, was noch weniger Sinn macht.

Was willst du jetzt genau? Eine Zahl an einen String anhängen? Einer Variablen einen Datentyp zuweisen? (siehe auch in der Hilfe)

Ich rate jetzt einfach mal das du sowas in der Art suchst:

Code: Alles auswählen

EnableExplicit

Define eingabe$
Define nr.i
Define DateiHandle
Define DateiName$ = "Daten.txt"

DateiHandle = CreateFile(#PB_Any,DateiName$)

If IsFile(DateiHandle)
  For nr = 100 To 900
    eingabe$ = InputRequester("Eingabe","Bitte Daten eingeben:","")
    If eingabe$ = ""
      End
    EndIf
    WriteStringN(DateiHandle, Str(nr)+eingabe$)
  Next nr
EndIf

CloseFile(DateiHandle)
/Edit: Hm, mal wieder viel zu langsam ^^

Verfasst: 29.07.2009 12:49
von mikstart
datensatz nummer 100 bis 900
name$
stück
preis

name$, stück(integer), Preis (###.##)

ich habe 800 datensätze (die ich nicht weis wie man die anlegt) mit den variabeln name$, stück , preis die leer sind und vordefeniert sind:

len(name$) = 10, stück = integer, preis = double aber formatiert ###.##

nun öffne ich datensatz 100 (mit welchen befehl auch immer in pure basic)schreibe ich über eine eingaberoutine in datensatz zb

eingabe$=Pizza
name$=name$ + eingabe$

eingabe=5
stück=stück+eingabe

eingabe=5.90
preis=preis+eingabe

speicher datensatz 100 ab. (in qbasic mit put#)

nun wenn ich datensatz 100 (mit get# in qbasic) lese und name$, stück, preis per print auf den bildschirm hole kommt

Pizza
5
5.90

dafür braucht man doch keine datenbank oder?
also in qbasic zunindest nicht.

gruss mik

Verfasst: 29.07.2009 12:59
von ts-soft
mikstart hat geschrieben: dafür braucht man doch keine datenbank oder?
also in qbasic zunindest nicht.
Random Access-Dateien werden so in PB nicht unterstützt, dafür mußte
Dir selber was schreiben oder Du kannst die RFile Lib (OOP) aus den
PBOSL-Userlibs nutzen, bzw. Du nimmst eine Datenbank.

Verfasst: 29.07.2009 13:21
von gnozal
mikstart hat geschrieben:datensatz nummer 100 bis 900
name$
stück
preis

name$, stück(integer), Preis (###.##)
Benutze strukturen und ReadData() / WriteData().

Verfasst: 29.07.2009 13:21
von Kaeru Gaman
um klassische Datensätze in PB zu erzeugen, benutzt du Structures mit Fixstrings.
(gut dass ich verstehe was du meinst, hab mich schon in den 80ern mit RBase rumschlagen müssen)


also für das Beispiel:

Code: Alles auswählen

Structure RecSet
  Name.s[20]
  Price.q
  Units.l
EndStructure
womit die Länge des Feldes "Name" auf 20 Zeichen begrenzt ist.

das bietet dir den Vorteil, dass du nicht nur jeden Datensatz einzeln lesen oder schreiben kannst,
sondern auch die gesamte Tabelle in einem Rutsch.

Code: Alles auswählen

Structure RecSet
  Name.s[20]
  Price.q
  Units.l
EndStructure

Dim DataBase.RecSet(800)


; Datensatz Suchen
FileSeek( #DB, RecordNumber * SizeOf( RecSet ) )

; Datensatz schreiben
WriteString( #DB, DataBase(RecordNumber)\Name  )
WriteQuad  ( #DB, DataBase(RecordNumber)\Price )
WriteLong  ( #DB, DataBase(RecordNumber)\Units )

; Datensatz lesen
DataBase(RecordNumber)\Name  = ReadString( #DB )
DataBase(RecordNumber)\Price = ReadQuad  ( #DB )
DataBase(RecordNumber)\Units = ReadLong  ( #DB )

; komplette Tabelle schreiben
WriteData( #DB, @DataBase(), NumberOfRecords * SizeOf( RecSet ) )

; komplette Tabelle lesen
ReadData( #DB, @DataBase(), NumberOfRecords * SizeOf( RecSet ) )
das war jetzt mal auf die Schnelle hingeschmiert, kann sein dass ich nen Fehler reingehaun hab, aber das Grundprinzip stimmt so.

wie ts sagte
> Random Access-Dateien werden so in PB nicht unterstützt

aber wenn man weiß wie es funktioniert ist es easy umzusetzen,
weil die gesamte Funktionalität dieser Tabellentypen auf die einheitliche Datensatzlänge aufbaut.

Verfasst: 29.07.2009 13:35
von Kiffi
<MeinePersoenlicheMeinung>
Technik aus der Steinzeit. So sollte man heutzutage nicht wirklich mehr
programmieren. Gehört (wie die Konsolen-Geschichte) auf den Friedhof.
R.I.P. und gut.
</MeinePersoenlicheMeinung>

Grüße ... Kiffi

Verfasst: 29.07.2009 13:41
von Kaeru Gaman
da gebe ich dir grundsätzlich recht.

das Prinzip stammt noch aus den absoluten Anfängen und war praktikabel,
als man auf Magnetbändern gespeichert hat wo man beim Zugriff im Voraus berechnen wollte,
wie lange man ungefähr vorspulen muss wenn man den Datensatz #4711 sucht.

in den 80ern, als ORACLE noch ein Heiliger Gral und dementsprechend teuer war,
war das auch noch angesagt weil man damit selber sticken konnte.

aber heute, wo SQL in fast jeder Umgebung praktisch selbstverständlich ist,
ist es echt viel zu sehr Oldskool, im Grunde nur noch für eine MuseumsDemo zurechtfertigen.
Schön zu wissen was es ist und wie es geht, aber nicht mehr praktikabel.