Put# und Get# in Pure Basic

Anfängerfragen zum Programmieren mit PureBasic.
mikstart
Beiträge: 25
Registriert: 23.07.2009 23:12

Put# und Get# in Pure Basic

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Beitrag 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 :)
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag 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 ^^
mikstart
Beiträge: 25
Registriert: 23.07.2009 23:12

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
gnozal
Beiträge: 219
Registriert: 04.12.2004 13:01
Wohnort: Frankreich (67)
Kontaktdaten:

Beitrag von gnozal »

mikstart hat geschrieben:datensatz nummer 100 bis 900
name$
stück
preis

name$, stück(integer), Preis (###.##)
Benutze strukturen und ReadData() / WriteData().
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten