Salut 8)
Voila je cherche une idée de programme qui me permetrais d'apprendre à utiliser et à manipuler des fichiers et qui soit accessible pour un débutant comme moi. (C'est à dire que j'ai 3 semaines de pratique).
Merci de me donner des pistes.
Salut 8)
Voila je cherche une idée de programme qui me permetrais d'apprendre à utiliser et à manipuler des fichiers et qui soit accessible pour un débutant comme moi. (C'est à dire que j'ai 3 semaines de pratique).
Merci de me donner des pistes.
Un annuaire telephonique par exemple? où tu stockera les numeros, noms prenoms, adresses , avec des options : recherches, ajout, modification...
c'est p'tet un peu trop pour commencer , à toi de voir
Merci pour l'idée.
J'essaye de finir le morpion que je programme et je m'attele à cet annuaire. Je vous tiendrai au courant en cas de panne
Bonne Fêtes.
Comme tu n'as pas encore l'adsl, je vais poster dans le forum plutôt!
Je ne pourrais pas faire un tutoriel très complet sur la lecture / écriture des fichiers en quelque ligne, surtout que c'est un sujet assez complexe! Je vais donc te donner les grandes lignes, et nous verrons le reste par la suite...
FICHIER BINAIRE:
Il sagira ici d'obtenir les données brutes du fichiers (octet=byte). On peut soit lire ces données en bloc, soit les lire une par une. Pour des raisons évidentes, la lecture/écriture par bloc est plus rapide. Voici un exemple de lecture de fichier par bloc de 256 octets. J'utilise dans cet exemple un tableau pour stocker les octets lus, mais l'utilisation d'un pointeur est aussi faisable. Avec TP7, la taille maximale d'un enregistrement a été fixée à 65536 octets (64ko) quelque soit le type.
Pour le détail de chaque commande, voir l'aide en ligne du compilateur avant de poser des questions. En ce qui concerne la directive de compilation {I}, elle est utilisée avec la fonction IOResult. {I-} permet d'éviter l'affichage d'erreur d'entrée/sortie. Ces erreurs ne sont pas oubliées, elles sont juste reportées sur le {$I+} suivant. ainsi IOResult devient actif. Pour lire les octets un par un, il faut utiliser Read au lieu de BlockRead, et pour écrire dans le fichier, utiliser Write ou blockWrite.
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 Uses Crt,Dos; Const MaxSize=$100; Var F:File; FileName:string; Buf:array[0..MaxSize-1]of byte; FSize,Readed:Longint; Begin {$I-} Assign(F,FileName); Reset(F,1); FSize:=FileSize(F); Repeat Blockread(F,Buf,MaxSize,Readed); Gotoxy(1,1); if({$I+}IOresult{$I-}<>0)then Writeln('Error read file!')else Writeln('Position: ',FilePos(F)); Delay(100); Until(Readed<>MaxSize)or(KeyPressed); Close(F); End.
FICHIER TYPÉ:
Un fichier typé permet de définir son contenu comme des variables typées, mais en réalité, un fichier contiendra toujours des octets. Par exemple "File of Longint" contiendra uniquement des Longints. Un Longint est composé de 4 octets (32bits). Un enregistrement sera donc de 4 octets. On trouve toutes sortes de fichiers typés. Voici quelques exemples pris au hasard:
Ces types sont "simples", mais on peut composer ses propres types avec Record... Voici un exemple de lecture d'un fichier typé. TMontype est composé de 2 Longints, et d'un string[10]. La taille (en octet) d'un enregistrement peut-être donnée par la fonction SizeOf:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Var F1:File of Byte; F2:File of Word; F3:File of Char; F4:File of Array[1..5]of Char; F5:File of string[3];
Pour aller plus loin, il est possible d'intégrer ses types perso à l'intérieur d'autre type, etc...
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
23
24
25
26
27
28
29
30
31
32
33 Uses Crt,Dos; Type TMontype=Record Left:Longint; Right:Longint; Name:string[10]; End; Var F:File of TMontype; FileName:string; Unite:TMontype; FPos,FSize:Longint; Begin {$I-} Assign(F,FileName); Reset(F); FSize:=FileSize(F); Repeat Read(F,Unite); FPos:=FilePos(F)); Gotoxy(1,1); if({$I+}IOresult{$I-}<>0)then Writeln('Error read file!')else Begin Writeln('Position: ',FPos); Writeln('Left: ',Unite.Left); Writeln('Right: ',Unite.Right); Writeln('Name: ',Unite.Name); End; Delay(100); Until(FPos(F)>=FSize Div SizeOf(TMontype))or(KeyPressed); Close(F); End.
Mais là n'est pas le sujet du topic. Pour ton projet d'annuaire, l'utilisation de fichier typé est l'idéal, à+
Salut
J'ai compris en theorie( reste à pratiquer) et je comprend un peu mieux les fichiers typé et leur utilité pour mon annuaire.
Mais j'ai une question à propos de IOresult.
Pourquoi {I-} n'est pas avant [I+} puisqu' il desactive le controle des E/S. :
Et puis j'avais pas pensé à utiliser l'aide de TP7 Et pourtant c'est très utile.
Merci et à+
La directive {$I} est à {$I-} par défaut, donc il n'y a pas contrôle des erreurs par défaut. {$I+} permet de mettre en marche le contrôle des erreurs !
a+
Bonjour,
J'ai tapé le code ci dessus sur les fichiers binaires. J'ai du changer Fsize et readed en integer (car ca compilait pas) et j'ai rajouter un ClrScr après le begin. Or Rien ne se passe quand le prog tourne alors que je devrait avoir la position si j'ai bien compris(si il ya pas d'erreur de lecture de fichier)
Bonne Année et à+
Est-ce que le fichier que tu ouvres existe au moins ?
Je comprend pas.
Quand je declare le F comme file. Ca cree un fichier qui est vide :
faut il le remplir de données pour que le prog donne la position?
Et comment le remplir :
Raaa là là. Worm débloque encore !
Voilà un petit extrait d'un fichier d'aide bien connu :
Donc, par défaut, la détection des erreurs E/S est activée !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 $I: Input/Output-Checking Switch ___________________________________ Enables or disables the automatic code generation that checks the result of a call to an I/O procedure. Syntax: {$I+} or {$I-} Default: {$I+} Type: Local Menu Command: Options|Compiler|I/O Checking
De plus, il est, excuse-moi Sub0, grotesque de réactiver la détection des erreurs E/S pour lire le statut de IOResult, qui ne ait que renvoyer la valeur de la variable InOutRes de l'unité System
En ce qui concerne Yffick : si tu as déclaré ton fichier comme file, à savoir un fichier non-typé, prend bien garde à utiliser le paramètre facultatif de Reset et Rewrite :
Il permet de spécifier la taille des données à lire dans le fichier. Généralement, on lit des octets ! D'où le 1...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Reset(f, 1); ou Rewrite(f, 1);
A+
Pardon, pardon, je suis pas en forme en ce moment
B.A. & M.V.!
Pour info, avec Delphi, on n'est plus limité à un buffer de 64ko!
On peut aussi copier par bloc avec Read et Write, mais pas au delà de 64 ko (avec TP du moins).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Type Tbuf=Record dat:Array[0..MaxSize-1]of Byte; End; Var F:File of Tbuf;Si tu le dis...grotesque de réactiver la détection des erreurs E/S
Seulement, j'ai toujours vu que l'on utilisait comme cela (avec des variantes des fois).
Autrement, il me semble qu'il existe la fonction DosError, capable aussi de détecter les erreurs d'E/S.
à+
DosError renvoie le numéro de l'erreur DOS ! IOresult renvoie le numéro de l'erreur d'entrée/sortie ...
IOResult est spécifique à TP, qui enregistre seul les éventuelles erreurs, et bloque toutes les opérations d'entrée/seortie tant que sa valeur n'est pas nulle (tant qu'on ne l'a pas consultée).
DosError est interne au Dos, et ne bloque en aucun cas les opérations d'E/S. Les erreurs peuvent donc se multiplier et les nouvelles effacent les anciennes.
Quant à IOResult, pour revenir dessus, elle est déclarée comme ceci :
Aucun risque donc ! Que l'on soit en $I+ ou $I-, le résultat sera le même.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6GetIORes: XOR AX,AX XCHG AX,InOutRes RETF
A+
bonjour,
voila pour mon annuaire, je seche sur quelque point qui n'ont pas de secret pour vous j'en suis sur.
Je voudrais ecrire sur le fichier 'fichierAnnu' les données des personnes saisis avec leur coordonneés afin de pouvoir les 'resortir' à la demande :
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 program Annu; uses crt; type personne = record titre: string; Nom :String; Prenom:string; NumRue: integer; nomRue: String; ville:string; var Annuaire : array[1..10] of personne; nbPers:integer; i,j : integer; f: file of personne; Unite: personne; Fpos,Fsize:integer; Begin Clrscr; Assign(F,FichierAnnu); REset(F); Fsize:=FileSize(f); write('Nbre de personne à saisir '); readln(nbpers); for i to nbPers do begin; write('Entrez le titre de la personne : '); readln(Annuaire[i].titre); write('Entrez le nom : '); readln(Annuaire[i].nom); write('Entrez le prénom : '); readln(Annuaire[i].prenom); write('Entrez le N° de rue : '); readln(Annuaire[i].numRue); write('Entrez le nom de la rue : ') readln(Annuaire[i].nomRue); write('Entrez la ville : '); readln(Annuaire[i].ville); end;
De plus je voudrais pouvoir rajouter des personnes à la suite du fichier :
Merci d'avance pour les tuyaux
De suite, les strings de l'enregistrement doivent-être délimitées! Par exemple string[32]. Et puis logiquement, on saisit les données, puis on les ecrit sur le disque! Tu ouvres le fichier sans rien écrire, ni le refermer! Tu voudrais que l'on trouve la partie manquante, le reste de la procédure que tu n'as pas mis? Je pense que l'on t'a donné suffisament d'informations comme ça afin que tu puisses te débrouiller seul à présent pour résoudre cette egnime! Sache que la programmation est une suite sans fin de problèmes à résoudre! Alors amigo, je te souhaite un bon courage, car il est temps de voler de tes propres ailes! à+
J'ai un peu retravailler mon Prog.
Voila le probleme c'est qu'il me liste les personnes d'une façon bizarre avec des caracteres spéciaux devant :
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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 program Annu; uses crt; type personne = record titre: string[32]; Nom :String[32]; Prenom:string[32]; NumRue: integer; nomRue: String[32]; ville:string[32]; var Annuaire : array[1..10] of personne; nbPers:integer; i,j : integer; f: file of personne; Unite: personne; Fpos,Fsize:integer; Begin Clrscr; Assign(F,FichierAnnu); REset(F); Fsize:=FileSize(f); write('Nbre de personne à saisir '); readln(nbpers); for i to nbPers do begin; write('Entrez le titre de la personne : '); readln(Annuaire[i].titre); write('Entrez le nom : '); readln(Annuaire[i].nom); write('Entrez le prénom : '); readln(Annuaire[i].prenom); write('Entrez le N° de rue : '); readln(Annuaire[i].numRue); write('Entrez le nom de la rue : ') readln(Annuaire[i].nomRue); write('Entrez la ville : '); readln(Annuaire[i].ville); write(f,Annuaire[i]); for j:=1 to nbpers do read(f,annuaire[j]); fpos:=(filePos(f)); gotoxy(1,1) if({$I+}IOresult{$I-}<>o) then writeln('error read file !') else begin writeln('position : ',Fpos); writeln('titre:'annuaire[i].titre); end; close(f) readln; end.
et puis il me met 'disk read error.'
A l'attention de Sub0: tu l'as dit toi meme c'est un sujet complexe et quand on debute on cherche un peu d'aide. Je veux comprendre.je cherche juste à apprendre et je veux pas qu'on me donne la solution mais quand j'ai pas d'idée je demande.
Mouarf, tu es dûr Sub !!
Bon petit indice : tu y es presque, il ne reste plus qu'à écrire dans le fichier les personnes que tu viens de créer. Pour cela, il faut créer une personne Unité, puis l'écrire dans le fichier avec wr***(Uni**);
Voilà, j'ai pas tout dis
a+
il manque un end;
rectification
;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 write(f,annuaire[i]); end;
Ouais! Mais je reconnaîs quand l'aide est nécessaire ou pas! Quand on abuse du forum, ça m'agace légé... surtout que l'on apprend mieux en cherchant les choses soi-même. Yffick, j'estime t'avoir donné les informations suffisantes pour débuter. Tu trouveras aussi de nombreux topics traitant sur les fichiers typés, d'ailleurs ce forum est là en dernier recours, tenez-le vous pour dit! Sur ce, un p'tit tag résolu, et je vous souhaite une excelente soirée et un bon dev! à+Mouarf, tu es dûr Sub !!
_______________________
-> Lire les règles du forum!
-> Pensez au tag [résolu]!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager