QBasic 1.1

Résolu
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. 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
    1. 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.