Bonjour à tous,

J'ai lu qu'en ouvrant un fichier, il est possible d'utiliser les directives {$I-} et {$I+} ainsi que IORESULT pour gérer l'existence d'un fichier.

Pourrait-on m'expliquer pourquoi avec ce qui suit la condition ' IF IORESULT <> 0 '
n'est pas exécuté si le fichier n'existe pas?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PROGRAM ouverture;
VAR
  NomDeFichier: STRING;
  fichier: TEXT;
BEGIN
  NomDeFichier := 'vecteurs.txt';
  ASSIGN(fichier,NomDeFichier);
{$I-}
  RESET(fichier);
  WRITELN('1.IORESULT: ', IORESULT);
  REPEAT
    IF IORESULT <> 0 THEN BEGIN
      WRITELN('Ce fichier n''existe pas.');
      WRITE('Introduisez un autre nom de fichier: ');
      READLN(NomDeFichier);
      ASSIGN(fichier,NomDeFichier);
      RESET(fichier);
      WRITELN('2.IORESULT: ', IORESULT);
    END
  UNTIL IORESULT = 0
{$I+}
END.
Si le fichier 'vecteurs.txt' existe, j'obtiens

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
$ ./ouverture 
(entre {})
1.IORESULT: 0
et sinon

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
$ ./ouverture 
(entre {})
2
Avec le programme modifié comme suit:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
REPEAT
    IF IORESULT = 0 THEN
      WRITELN('1.IORESULT: ', IORESULT)
    ELSE BEGIN
      WRITELN('Ce fichier n''existe pas.');
      WRITE('Introduisez un autre nom de fichier: ');
      READLN(NomDeFichier);
      ASSIGN(fichier,NomDeFichier);
      RESET(fichier);
      WRITELN('2.IORESULT: ', IORESULT);
    END
UNTIL IORESULT = 0
J'obtiens ça si j'introduis le nom d'un fichier existant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
$ ./ouverture 
(entre {})
Ce fichier n'existe pas.
Introduisez un autre nom de fichier: vecteurs
2.IORESULT: 0
mais ceci avec un nom de fichier inexistant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
$ ./ouverture 
(entre {})
Ce fichier n'existe pas.
Introduisez un autre nom de fichier: machin
2
Bref, je n'obtiens jamais la répétition qui permettrait de continuer jusqu'à ce que le nom correct soit introduit.

Je travaille avec Free Pascal 2.4.0-2 sur Debian Stable.

Merci d'avance,

G.