Lecture d'un fichier à accés direct...

Lecture d'un fichier à accés direct... - Delphi/Pascal - Programmation

Marsh Posté le 23-10-2005 à 01:41:39    

Bonjour,
j'ai créé un fichier "hotel.dat" avec Delphi en mettant les informations du type hotel. Je voudrais fair la moyenne des prix des hotels mais je n'arrive pas à acceder aux données de mon fichier hotel.dat. J'avais essayé également avec une boucle while eof...(je pense que àa doit être mieux que le repeat mais bon...) donc je fais la moyenne et je l'affiche sous format HTML.
 
type
  THotel = record
    code, prix, cp : integer;
    designation : string[30];
    numero_rue : string[10];
    rue : string[50];
    ville : string[20];
  end;
 
var
  rec : file of THotel;
  MonHotel : THotel;
 
  moy, i, total : integer;
 
 
begin
   total := 0;
   moy := 0;
   i := 1;
 
    assignfile(rec,'hotel.dat');
 
    if fileexists('hotel.dat') then
        begin
 
 
          Repeat
                  read(rec,MonHotel);
            total := total + MonHotel.prix;
            i:= i + 1;
 
 
             moy := (total DIV i);
 
             //ecriture à l'écran
             writeln('Content-type: text/html');
             writeln;
             writeln('<html>');
             writeln('<head><title>Moyenne des prix des hôtels</title></head>');
             writeln('<body>');
             writeln('<h1>Moyenne des prix des hôtels<hr></h1>');
             writeln('La moyenne des prix des hôtels : ' + IntToStr(moy));
             writeln(' €');
          Until SeekEof (rec);
      end;
 
  close(rec);
 
end.

Reply

Marsh Posté le 23-10-2005 à 01:41:39   

Reply

Marsh Posté le 23-10-2005 à 18:54:30    

Tu mettrais pas plutôt le calcul de moyenne et l'affichage hors de la boucle ?
 
Et comment ça tu "n'arrives pas à accéder aux données" ?


Message édité par antp le 23-10-2005 à 18:55:13

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 23-10-2005 à 22:28:03    

oula oui...on a ça alors? Le truc c'est que je n'ai pas d'erreur de compilation mais quand je veux pour executer le programme bah la page html s'affiche avec message ne peut pas afficher le contenu de la page blabla alors je me demande j'utilise bien le fichier en accés direct dans ce cas...merci d'avance
 
type  
  THotel = record  
    code, prix, cp : integer;  
    designation : string[30];  
    numero_rue : string[10];  
    rue : string[50];  
    ville : string[20];  
  end;  
 
var  
  rec : file of THotel;  
  MonHotel : THotel;  
 
  moy, i, total : integer;  
 
 
begin  
   total := 0;  
   moy := 0;  
   i := 1;  
 
     
             Repeat  
               read(rec,MonHotel);  
               total := total + MonHotel.prix;  
               i:= i + 1;  
            Until SeekEof (rec);  
 
            moy := (total DIV i);  
 
             //ecriture à l'écran  
             writeln('Content-type: text/html');  
             writeln;  
             writeln('<html>');  
             writeln('<head><title>Moyenne des prix des hôtels</title></head>');  
             writeln('<body>');  
             writeln('<h1>Moyenne des prix des hôtels<hr></h1>');  
             writeln('La moyenne des prix des hôtels : ' + IntToStr(moy));  
             writeln(' €');  
           
      close(rec);  
 
end.

Reply

Marsh Posté le 23-10-2005 à 23:35:11    

Essaie déjà avec un vrai browser (Firefox, Opera, etc.) qui te donnera un vrai message d'erreur plutôt que de dire juste qu'il ne peut pas afficher le contenu :p


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 23-10-2005 à 23:52:24    

lol oui aussi mais j'ai pas hey hey

Reply

Marsh Posté le 24-10-2005 à 00:07:13    

T'as pas quoi ? Un vrai browser ? Ça se télécharge facilement :p
 
Il manque quand même un bout dans ton code. Après le AssignFile il faut faire un Reset pour ouvrir le fichier. Et j'utiliserais Eof plutôt que SeekEof, qui semble plutôt destiné à des fichiers textes...


Message édité par antp le 24-10-2005 à 00:08:01

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-10-2005 à 00:34:38    

program moyenne;
 
{$APPTYPE CONSOLE}
 
uses
  sysutils,
  btsinfo;
 
type
  THotel = record
    code, prix, cp : integer;
    designation : string[30];
    numero_rue : string[10];
    rue : string[50];
    ville : string[20];
  end;
 
var
  rec : file of THotel;
  MonHotel : THotel;
 
   i : integer;
   moy , total : integer;
 
begin
   total := 0;
   moy := 0;
   i := 1;
 
            assignfile(rec,'hotel.dat');
            reset(rec);
            WHILE NOT Eof (rec) DO
            BEGIN
               Read(rec,MonHotel);
               total := total + MonHotel.prix;
               i:= i + 1;
            END ;
 
            moy := (total DIV i);
 
             //ecriture à l'écran  
             writeln('Content-type: text/html');
             writeln;
             writeln('<html>');
             writeln('<head><title>Moyenne des prix des hôtels</title></head>');
             writeln('<body>');
             writeln('<h1>Moyenne des prix des hôtels<hr></h1>');
             writeln('La moyenne des prix des hôtels : ' + IntToStr(moy));
             writeln(' €');  
 
      close(rec);
 
end.

Reply

Marsh Posté le 24-10-2005 à 00:36:10    

regarde j'ai fait ça c'est déjà mieux que la premiere version sauf que ça ne marche toujours pas hey hey (je pense qu'il serait mieux de gérer la moyenne avec un REAL mais c'est quoi la fonction IntToStr(moy) mais pour le réel ? ;)

Reply

Marsh Posté le 24-10-2005 à 10:39:40    

FloatToStr, ou Format avec %f ou %g, selon ce que tu veux comme type d'affichage.
T'as essayé d'envoyer du texte à l'écran sans lire le fichier, juste afficher un 'bonjour', pour être sûr que c'est la lecture du fichier qui bloque ?
À l'inverse, t'as essayé de lancer le soft directement depuis la console plutôt qu'en CGI, pour voir le résultat à l'écran de la console plutôt que via le browser ?s


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-10-2005 à 10:50:48    

jiojio a écrit :

regarde j'ai fait ça c'est déjà mieux que la premiere version sauf que ça ne marche toujours pas hey hey


Déjà, en html, quand on ouvre des balises il faut les fermer  :fou: ...
Ensuite, je te conseillerais de tester en premier lieu si ton programme calcule bien la moyenne, et après de tester la fonction d'affichage.
 

Citation :

(je pense qu'il serait mieux de gérer la moyenne avec un REAL mais c'est quoi la fonction IntToStr(moy) mais pour le réel ? ;)


Effectivement, si tu veux avoir une moyenne exacte, il vaut mieux utiliser un réél  :D (voire un  Currency ?)
Et pour la fonction équivalente à InttoStr, peut-être un "as String", ou en cherchant dans l'aide  :p  
 
AMHA :
1. Tu écris le bout de code qui te calcule la moyenne, avec un affichage simple (un bête Write qui t'affiche juste la moyenne, pas en html) et avec un (à la limite 2) hôtel dans ton .DAT.
2. Tu le testes avec le bon fichier .DAT
3. Tu écris le bout de code qui affiche la page html,  

Code :
  1. //ecriture à l'écran   
  2. moy := <une valeur quelconque>
  3. writeln('Content-type: text/html');
  4. writeln;
  5. writeln('<html>');
  6. writeln('<head><title>Moyenne des prix des hôtels</title></head>');
  7. writeln('<body>');
  8. writeln('<h1>Moyenne des prix des hôtels<hr></h1>');
  9. writeln('La moyenne des prix des hôtels : ' + IntToStr(moy));
  10. writeln(' €');


 
4. Et une fois que les deux parties fonctionnent, tu fais la totale.
 
PS : Tu devrait mettre ton close dès que tu as fini d'utiliser le fichier .DAT, et - dans l'idéal - encadrer ton bloc "lecture du fichier .DAT" par un Try-Except...

Reply

Marsh Posté le 24-10-2005 à 10:50:48   

Reply

Marsh Posté le 24-10-2005 à 11:01:29    

On m'a appris à faire comme ça pour l'affichage..mais je ne comprends pas dans le programme moyenne je lis bien le fichier avant d'afficher la moyenne des prix...
Regarde c'est mon programme qui permet de mettre les informations dans le fichier (il fonctionne parfaitement) :
 
program hotel;
 
{$APPTYPE CONSOLE}
 
uses
  sysutils,
  btsinfo;
 
type
  THotel = record
    code, prix, cp : integer;
    designation : string[30];
    numero_rue : string[10];
    rue : string[50];
    ville : string[20];
  end;
 
 
var
  rec : file of THotel;
  MonHotel : THotel;
  designation, numero_rue, rue, ville : string;
  code , prix, cp : integer;
  position : integer;
  tmp : string;             // la variable tmp est intermédiare et servira à stocker
                            // une donnée du formulaire afin de la modifier
 
begin
  //attention la procedure RequestFormInit et la fonction RequestFom ne font pas partie de DELPHI !
  RequestFormInitialize(); //permet de transferer les données du formulaire dans un fichier temporaire.
 
  tmp := requestform('code'); //recherche de la clé 'code' dans le fichier temporaire et renvoie de la valeur.
  code := strtoint(tmp);      // stroint transforme un integer en string
 
  designation:=requestform('designation');
 
  tmp := requestform('prix');
  prix := strtoint(tmp);      // stroint transforme un integer en string
 
  numero_rue:=requestform('numero_rue');
  rue := requestform('rue');
  tmp := requestform('cp');
  cp := strtoint(tmp);
  ville := requestform('ville');
 
 
 //ecriture à l'écran
  writeln('Content-type: text/html');
  writeln;
  writeln('<html>');
  writeln('<head><title>Enregistrement des hotels</title></head>');
  writeln('<body>');
  writeln('<h1>Saisir les informations concernant les élèves<hr></h1>');
  writeln('Code               : '+ IntToStr(code) +'<br>');          // IntToStr() permet de convertir
  writeln('Désignation              : '+ designation +'<br>');       // un integer en string
  writeln('Prix              : '+ IntToStr(prix) +' € <br>');
  writeln('Numéro de rue              : '+ numero_rue +'<br>');
  writeln('Rue              : '+ rue +'<br>');
  writeln('Code postal              : '+ IntToStr(cp) +'<br>');
  writeln('Ville              : '+ ville +'<br>');
  writeln('</body></html>');
 
 
  //enregistrement des données sur l'hotel dans un fichier du serveur
  MonHotel.code:=code;
  MonHotel.designation:=designation;
  MonHotel.prix:=prix;
  MonHotel.numero_rue:=numero_rue;
  MonHotel.rue:=rue;
  MonHotel.cp:=cp;
  MonHotel.ville:=ville;
 
 
    assignfile(rec,'hotel.dat');
    if fileexists('hotel.dat') then
  begin
    reset(rec);
    position:=filesize(rec);
    seek(rec,position);
    write(rec,MonHotel);
  end
  else
  begin
    rewrite(rec);
  end;
  write(rec,MonHotel);
  close(rec);
 
end.

Reply

Marsh Posté le 24-10-2005 à 11:09:24    

macgawel a écrit :

Déjà, en html, quand on ouvre des balises il faut les fermer  :fou: ...


 
Non, ça c'est en XML/XHTML. En HTML on peut laisser plein de trucs ouverts, cf cette page qui a une syntaxe tout à fait valide : http://antp.be/temp/html4open.html


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 24-10-2005 à 13:39:11    

effectivement ! je n'avais pas fermé les balises (j'y avais penser ce matin dans mon lit...et oui LOL)
Enfin merci pour votre aide :)
Il fonctionne parfaitement maintenant :)
bye

Reply

Marsh Posté le 25-10-2005 à 00:24:19    

Bon j'ai encore un petit pb...ça marchait et...ça ne marche plus :| !
 
regardez je vois pas pourquoi là...
 
 
program moyenne;
 
{$APPTYPE CONSOLE}
 
uses
  sysutils,
  btsinfo;
 
type
  THotel = record
    code, prix, cp : integer;
    designation : string[30];
    numero_rue : string[10];
    rue : string[50];
    ville : string[20];
  end;
 
// déclarations des variables
var  
  rec : file of THotel;
  MonHotel : THotel;
 
  total,i : integer;
  moy : real;
 
begin
   total := 0;
   moy := 0;
   i := 1;
 
            assignfile(rec,'hotel.dat');  // Affectation de nom de fichier
            reset(rec);   // Ouverture du fichier en lecture
            while not Eof (rec) do  // Jusqu' à la fin du fichier
            begin
               read(rec,MonHotel);  // Après chaque opération la pointeur est avancé vers la position de l’élément suivant
               total := total + MonHotel.prix; // total vaut le total des prix des hôtes se trouvant dans le fichier hoteldat
               i := i + 1;   // à chaque fois que l'on trouve un prix i vaut i + 1
            end;
 
            moy := (total / i); // moy vaut le total des prix / par le nombre de prix trouvés
             
 
 
             //ecriture à l'écran  
             writeln('Content-type: text/html');
             writeln;
             writeln('<html>');
             writeln('<head><title>Moyenne des prix des hôtels</title></head>');
             writeln('<body>');
             writeln('<h1>Moyenne des prix des hôtels<hr></h1>');
             writeln('La moyenne des prix des hôtels : ' + FloatToStr(moy));
             writeln(' €');
             writeln('</body></html>');  
 
             close(rec);  // Fermeture du fichier
end.

Reply

Marsh Posté le 25-10-2005 à 00:25:32    

le close on pourrait le mettre avant le calcul de la moyenne mais ça ne change rien...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed