QBasic 1.1

Résolu/Fermé
tonyhawk Messages postés 22 Date d'inscription jeudi 14 février 2008 Statut Membre Dernière intervention 21 février 2008 - 14 févr. 2008 à 15:14
tonyhawk Messages postés 22 Date d'inscription jeudi 14 février 2008 Statut Membre Dernière intervention 21 février 2008 - 15 févr. 2008 à 16:28
Bonjour,

J'essais de produire un programme en lecture/écriture séquentielle qui me permetterais de faire des calculs sur deux ligne en même temps avec ce genre de di fichier: le 12 sur la première ligne me disant qu'il y a 12 lignes qui suive.

BEEP2001 0 12 1 . .
0.00 4.45 3.09 7.54 0.41 0
0.98 4.55 3.33 7.17 0.35 0
4.17 5.12 3.33 6.56 0.14 0
8.33 5.41 3.46 6.41 0.10 0
12.50 5.14 3.60 5.97 0.16 0
16.67 5.16 3.33 5.72 0.06 0
20.83 5.41 3.84 5.52 0.00 0
25.00 6.14 4.21 5.17 0.08 0
29.17 6.32 5.30 4.59 0.08 0
33.33 6.77 6.26 4.24 0.16 0
37.50 7.07 7.34 3.70 0.20 0
37.93 7.07 7.34 3.70 0.20 0
A voir également:

2 réponses

Bonjour,

Je te propose cette solution:
Pour lire ce genre de fichier séquentiel, il faut en connaitre sa structure.
C'est surtout vrai pour la première ligne si les données quelle contient ont une importance.
En supposant que seules les lignes suivantes nous intéressent, et sachant que chaque ligne a 6 valeurs, voici le code:

REM Dimensionner 2 tables de 6 elements
Dim TAB1#(6), TAB2#(6)

Open "MonFichier" for input as #1
REM On lit la première ligne, mais on ne la traite pas
Line input #1, texte$

While not eof(1)
REM On lit les lignes suivantes 2 par 2 et on stocke les valeurs dans TAB1 et TAB2
For i%=1 to 6
On Error Goto FIN
Input #1, TAB1(i%)
Next i%
For i%=1 to 6
Input #1, TAB2(i%)
Next i%
On Error Goto 0

REM On dispose des valeurs de 2 lignes qu'on peut exploiter par leurs indices
REM
REM Appel du sous-programme de traitement
Gosub MaSubroutine
REM
REM On boucle jusqu'a la fin du fichier
Wend
REM
:FIN
REM On ferme le fichier
Close #1
END

:MaSubroutine
.
.
Return

La gestion des erreurs avec ON ERROR GOTO permet d'eviter l'arret du programme pour "Input past end".

Je ne suis pas très sur de la syntaxe, il y a longtemps que je n'utilise plus QBAsic, mais la logique est bonne.

Salut.
0
tonyhawk Messages postés 22 Date d'inscription jeudi 14 février 2008 Statut Membre Dernière intervention 21 février 2008
15 févr. 2008 à 16:28
La première ligne contient effectivement des données importantes sur la première ligne : un des chiffres me donne le nombre de lignes qui suivent
Mais merci qand même ça va m'aider pour des applications ultérieurs

CLS 0

DIM SHARED nom AS STRING
DIM SHARED vol AS STRING
DIM SHARED a AS STRING
DIM SHARED nb AS INTEGER
DIM SHARED i AS INTEGER
DIM SHARED arbre AS STRING

INPUT "fichier a cuber: "; nom
INPUT "fichier de volume: "; vol

OPEN nom FOR INPUT AS #1
OPEN vol FOR OUTPUT AS #2
PRINT #2, "**arbre**";
PRINT #2, "**nb sec";
PRINT #2, "***dhs**";
PRINT #2, "**dm3***"

DO WHILE NOT EOF(1)
LINE INPUT #1, a
IF ASC(LTRIM$(a)) > 64 THEN
nb = VAL(MID$(LTRIM$(a), 17, 8))
arbre = MID$(LTRIM$(a), 1, 8)
END IF
REDIM mes(nb - 1, 2) AS SINGLE
REDIM mesure(0) AS SINGLE
FOR i = 0 TO (nb - 1)
LINE INPUT #1, b$
mes(i, 1) = VAL(MID$(b$, 4, 4))
mes(i, 2) = VAL(MID$(b$, 25, 8))
NEXT i
volume# = 0
FOR i = 0 TO (nb - 2)
volume(0) = volume(0) + ((3.141592654# / 3000) * ((mes(i, 2) * 2.54 / 2) ^ 2) * ((mes(i + 1, 1) - mes(i, 1)) * 30.48) * (1 + (mes(i + 1, 2) / mes(i, 2)) + ((mes(i + 1, 2)) ^ 2 / (mes(i, 2) ^ 2))))
NEXT i
diam = 2.54 * mes(0, 2)
PRINT #2, arbre;
PRINT #2, USING "########"; nb;
PRINT #2, USING "#####.##"; diam;
PRINT #2, USING "####.###"; volume(0)

ERASE mes
ERASE volume
LOOP

CLOSE #1
CLOSE #2
END
0