Qbasic und externe Dateien

Hallo an alle,

ich brauche ein paar Tips, wie ich unter Qbasic in externe Dateien schreiben und diese später auch wieder öffnen kann.

Beispiel:

For a = 0 to 100
Input x,y,z,
Next a:

Jetzt eine Datei neu erstellen und alle eingegebenen Dateien seriell abspeichern (also 300 Zahlen).
Datei schließen und bsp.weise unter a: abspeichern

Drei Tage später ein Programm öffnen, was auf jene Datei auf a: zurückgreift und diese Dateien in einer Art „Read“ seriell zurückholt.

Read x,y,z, …
Ich habe die Sache mit „Open“ nicht ganz verstanden …

Wer könnte mir da bitte zeigen, mit welchen Programmzeilen ich so etwas mache ?

Vielen Dank an alle, die mir helfen können!

Lutz

Soweit ich mich erinnere, verwaltet Basic die offenen Dateien in einem Array. Mit Open erh"alst Du einfach den Index in diese Dateiverwaltung, mit – Read Dateinummer, was – liest Du von der Datei. Es ist vieles sehr einfach (z.B. auch Grafik), leider auch die sinnvoll l"osbaren Problemstellungen.

Ciao, auch Lutz

Beispiel:

For a = 0 to 100
Input x,y,z,
Next a:

Jetzt eine Datei neu erstellen und alle eingegebenen Dateien
seriell abspeichern (also 300 Zahlen).
Datei schließen und bsp.weise unter a: abspeichern

Drei Tage später ein Programm öffnen, was auf jene Datei auf
a: zurückgreift und diese Dateien in einer Art „Read“ seriell
zurückholt.

Read x,y,z, …

Datei$ = "a:\xyz.dat" ' \*\*\* Name der Datei \*\*\*

REM \*\*\*\*\* Datei so oeffnen, dass in sie geschrieben werden kann \*\*\*\*\*
OPEN Datei$ FOR OUTPUT AS #1
REM \*\*\*\*\* 100 Eingaben zu je 3 Ziffern und diese in die Datei speichern \*\*\*\*\*
FOR a = 1 TO 3
 INPUT x, y, z
 PRINT #1, x, y, z
NEXT a
REM \*\*\*\*\* Datei schliessen \*\*\*\*\*
CLOSE #1

REM \*\*\*\*\* Datei so oeffnen, dass aus ihr gelesen werden kann \*\*\*\*\*
OPEN Datei$ FOR INPUT AS #1
REM \*\*\*\*\* Daten lesen und am Bildschirm anzeigen \*\*\*\*\*
DO WHILE NOT EOF(1)
 INPUT #1, x, y, z
 PRINT x, y, z
LOOP
REM \*\*\*\*\* Datei schliessen \*\*\*\*\*
CLOSE #1

Das, was ich da geschrieben habe, liest die Datei natürlich nicht 3 Tage später, sondern gleich wieder aus. Du müsstest halt 2 Programme draus machen.

Nur so nebenbei: for a=0 to 100 würde 303 Zahlen speichern, da es von 0 bis 100 101 Zahlen sind. Zähl mal nach … :wink:

Falls du noch Fragen dazu hast, darfst du mich gerne kontaktieren. Es macht mir fast Spass, mich wieder um 10 (Programmierer-)Jahre zurückzuversetzen … :wink:

Servus
Roland

Alles klar, ich bedanke mich erstmal.

Ein Frage habe ich noch:

Das Basic - Programm startet von einer selbsstartenden CD.
Je nach Rechner kann dieses CD-Laufwerk d:, e:, f: ,… sein.
Wie kriegt das Programm mit, auf welchen Laufwerk die Dateien nun liegen, auf die zurückgegriffen werden soll ?
( oder mit :
Input „Welchen Buchstaben hat Ihr CD-Laufwerk“;lw …)
Ist das mit Basic machbar oder kommt es in die autoexec.bat rein ?

Bis bald !
Lutz

… und noch eine Frage nachgeschoben.

Ich will vor Start des Basic-Programmes eine BMP als Startbildschirm anzeigen. Ist das mit einfachen Miteln machbar ?

Lutz (der hofft, jetzt alle Gedanken zusammen zu haben und nicht noch was nachschiebt … )

Das Basic - Programm startet von einer selbsstartenden CD.
Je nach Rechner kann dieses CD-Laufwerk d:, e:, f: ,… sein.
Wie kriegt das Programm mit, auf welchen Laufwerk die Dateien
nun liegen, auf die zurückgegriffen werden soll ?
( oder mit :
Input „Welchen Buchstaben hat Ihr CD-Laufwerk“;lw …)
Ist das mit Basic machbar oder kommt es in die autoexec.bat
rein ?

Servus Lutz

Wenn die Daten auf dem selben Laufwerk und womöglich sogar im selben Verzeichnis wie das Programm sind, brauchst du überhaupt kein Laufwerk anzugeben, sondern einfach nur den Namen der Datei, dann sucht er sie sowieso in dem Verzeichnis, wo das Programm gestartet wird.

Wenn die Daten zwar auf dem selben Laufwerk, aber in einem anderen Verzeichnis als das Programm liegen, dann müsste es funktionieren, wenn du einen relativen Pfad angibst.
Beispiel:
Das Programm liegt auf d:\Programm.exe und die Dateien liegen auf d:\Daten\xyz.dat.
Dann kannst du im Programm „.\Daten\xyz.dat“ (oder evtl. auch nur „Daten\xyz.dat“) als Dateiname an.

Falls es so nicht geht, dann ist es wohl am einfachsten, wenn du den Laufwerksbuchstaben mit einem Input-Befehl eingeben lässt.
Mit der autoexec.bat hat es sicher nichts zu tun und ich wüsste auch gar nicht, wie man den Laufwerksbuchstaben eines CD-Laufwerks unter DOS ermitteln könnte. Ich glaube fast, als ich mit Qbasic gearbeitet habe, hat es noch gar keine CD-Laufwerke gegeben … :wink:

Wie man eine Bitmap mit Qbasic anzeigt oder ob das überhaupt geht, kann ich dir leider nicht sagen, das habe ich noch nie versucht.

Bis zum nächsten Mal :wink:
Roland

Das Basic - Programm startet von einer selbsstartenden CD.
Je nach Rechner kann dieses CD-Laufwerk d:, e:, f: ,… sein.
Wie kriegt das Programm mit, auf welchen Laufwerk die Dateien
nun liegen, auf die zurückgegriffen werden soll ?

Hi,
qbasic kennt kein ‚if exist‘, aber dos. Also starte qbasic doch aufruf einer dos batch in autorun.inf oder autoexec.bat.
Man könnte auch das vorhandensein der autorun.inf zur ermittlung des cd-rom-laufwerk nehmen aber wenn du pech hast, ist auf dem pc ausgerechnet auf einer festplatte die f: heißt aus irgendwelchen gründen eine autorun.inf.

Meine Idee, du legst auf der Cd eine Datei mit beliebigem namen z.b.: ‚er45trxd.frg‘ an.

Inhalt von starteqb.bat:
set cdlw=
lfnfor on
for %%a in (i: h: g: f: e: d:smile: do if exist %%a\er45trxd.frg set
cdlw=%%a
%cdlw%\qbasic /run %cdlw%\programm.bas

In dem qb-programm programm.bas kannst du das cd-Laufwerk mit environ ansprechen/auswerten

Beispiel:
lw$=environ$(„cdlw“)
environ „cdlw=“
datei$=lw$+"\datei.dat
open datei$ for input as #1

Ich habe das nur theoretisch durchgespielt, test’s halt mal :smile:
Gruß
olala
achja, quellcodes von bmp-anzeige–programmen in qbasic findest du in suchmaschinen unter qbasic AND bmp

Meine Idee, du legst auf der Cd eine Datei mit beliebigem
namen z.b.: ‚er45trxd.frg‘ an.

Inhalt von starteqb.bat:
set cdlw=
lfnfor on
for %%a in (i: h: g: f: e: d:smile: do if exist %%a\er45trxd.frg set cdlw=%%a
%cdlw%\qbasic /run %cdlw%\programm.bas

Es gibt allerdings auch keine Garantie, dass auf der Festplatte nicht doch auch eine Datei mit dem Namen ‚er45trxd.frg‘ - oder wie auch immer man sie nennt - existiert …
Die Idee, die Laufwerksbuchstaben von hinten nach vorne (also z: bis d:smile: zu durchsuchen, gefällt mir, denn das CD-Laufwerk ist normalerweise das mit dem letzten Laufwerksbuchstaben - ausser es folgen noch Netzlaufwerke …
Aber eine 100%ig sichere Möglichkeit, den Laufwerksbuchstaben des CD-Laufwerks unter DOS festzustellen gibt es meines Erachtens nicht. :frowning:

Salü
Roland

Meine Idee, du legst auf der Cd eine Datei mit beliebigem
namen z.b.: ‚er45trxd.frg‘ an.

Inhalt von starteqb.bat:
set cdlw=
lfnfor on
for %%a in (i: h: g: f: e: d:smile: do if exist %%a\er45trxd.frg set cdlw=%%a
%cdlw%\qbasic /run %cdlw%\programm.bas

Probiere ich mal aus…

Es gibt allerdings auch keine Garantie, dass auf der
Festplatte nicht doch auch eine Datei mit dem Namen
‚er45trxd.frg‘ - oder wie auch immer man sie nennt - existiert

Auf der CD ist sind die vorhandenen Daten durchaus überschaubar ( weil alle von mir selbst erzeugt - abgesehen von Systemdateien)
und eine Dopplung ist mit an Sicherheit grenzender Wahrscheinlichkeit ausgeschlossen.

ist normalerweise das mit dem letzten Laufwerksbuchstaben -
ausser es folgen noch Netzlaufwerke …

Kann hier durchaus der Fall sein.

Gruß Lutz

"Ahm,

zwei Varianten, entweder einen Viewer per bat starten, weiss ich aber nicht, wie man da das Ende vern"unftig definiert, mal nach Splash (screen) suchen.

Oder die harte Variante: bei http://www.wotsit.org das bmp Format angucken, mit screen-Befehl in Grafikmodus wechseln und alle Pixel einzeln malen. In den meisten F"allen ist BMP einfach Bildgr"osse, Farbtabelle, Pixelwerte hintereinander.

Ciao Lutz

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Mir ist eine Möglichkeit eingefallen, wie man doch innerhalb eines Qbasic-Programms feststellen kann, ob eine Datei existiert.
Man versucht einfach, die Datei zu öffnen. Wenn kein Fehler auftritt, existiert sie. Wenn ein Fehler auftritt (mit on error abgefangen), dann nehmen wir an, dass sie nicht existiert.

Beispielcode:

Datei$ = "xyz.dat" ' \*\*\* Name der Datei \*\*\*
CLS

REM \*\*\*\*\* Ermittlung, auf welchem Laufwerk sich die Datei befindet. \*\*\*\*\*
REM Alle Laufwerke von z: bis d: durchsuchen
REM (90 = ASCII-Code von Z, 68 von D)
FOR a = 69 TO 68 STEP -1
 lw$ = CHR$(a)
 VollName$ = lw$ + ":\" + Datei$

 REM Wenn beim Open ein Fehler auftritt, nehmen wir an, dass die Datei
 REM nicht existiert und setzen die Suche beim n„chsten Laufwerk fort.
 ON ERROR GOTO DaNicht
 OPEN VollName$ FOR INPUT AS #1

 REM Error-Handling weider deaktivieren (weil es nur beim open gelten soll)
 ON ERROR GOTO 0

 REM kein Fehler aufgetreten --\> Hurra! --\> Datei existiert auf dem Laufwerk
 REM --\> Laufwerksbuchstaben merken und raus aus der Schleife
 LwOk$ = lw$
 EXIT FOR
DaNicht:
 LwOk$ = "" ' Datei nicht auf dem Laufwerk gefunden
 RESUME NextLw ' weiter mit dem naechsten Laufwerk
NextLw:
NEXT

IF LwOk$ = "" THEN
 PRINT Datei$ + " wurde leider auf keinem Laufwerk gefunden :frowning:"
ELSE
 PRINT Datei$ + " gefunden auf Laufwerk " + lw$
END IF

Möge die Übung gelingen
Roland
:wink:

qbasic kennt kein ‚if exist‘, aber dos. Also starte qbasic
doch aufruf einer dos batch in autorun.inf oder autoexec.bat.
Man könnte auch das vorhandensein der autorun.inf zur
ermittlung des cd-rom-laufwerk nehmen aber wenn du pech hast,
ist auf dem pc ausgerechnet auf einer festplatte die f: heißt
aus irgendwelchen gründen eine autorun.inf.

Meine Idee, du legst auf der Cd eine Datei mit beliebigem
namen z.b.: ‚er45trxd.frg‘ an.

Inhalt von starteqb.bat:
set cdlw=
lfnfor on
for %%a in (i: h: g: f: e: d:smile: do if exist %%a\er45trxd.frg
set
cdlw=%%a
%cdlw%\qbasic /run %cdlw%\programm.bas

In dem qb-programm programm.bas kannst du das cd-Laufwerk mit
environ ansprechen/auswerten

Beispiel:
lw$=environ$(„cdlw“)
environ „cdlw=“
datei$=lw$+"\datei.dat
open datei$ for input as #1