Lecture d'un fichier à accés direct... - Delphi/Pascal - Programmation
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" ?
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.
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
Marsh Posté le 24-10-2005 à 00:07:13
T'as pas quoi ? Un vrai browser ? Ça se télécharge facilement
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...
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.
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 ?
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
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 ...
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 (voire un Currency ?)
Et pour la fonction équivalente à InttoStr, peut-être un "as String", ou en cherchant dans l'aide
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 :
|
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...
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.
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 ... |
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
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
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.
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...
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.