QBasic 1.1

Résolu
tonyhawk Messages postés 22 Statut Membre -  
tonyhawk Messages postés 22 Statut Membre -
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
Configuration: Windows XP
Internet Explorer 6.0

2 réponses

  1. amigo
     
    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
  2. tonyhawk Messages postés 22 Statut Membre
     
    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