LECTURE ÉCRITURE DONNÉES

magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011 - 30 août 2004 à 16:59
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 31 août 2004 à 15:20
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25808-lecture-ecriture-donnees

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
31 août 2004 à 15:20
flush( stdin ) ca foire, c'est pas standard, c'est dangereux, c'est illogique...
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
31 août 2004 à 15:18
djl

d'ou le flush
cs_bethany Messages postés 26 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 15 mars 2005
31 août 2004 à 15:08
J'essais de suivre un peu mais j'avoue je suis un peu larguée parce que la je m'occupe d'un autre programme (pour mon taf)donc ca me perturbe un peu,
Ne croyez pas que je ne m'interesse pas a ce que vous dites, c'est juste qu'il faudra que je reprenne cela à tete reposée :)
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
31 août 2004 à 15:02
si tu fais juste

scanf( "%f", &saisie)

ca risque de boucler à l'infinie en cas d'erreur de saisie
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
31 août 2004 à 14:55
getc
tu passe tjs par des car !!!!
mé je crois qu'en fait, on a po le choix

merci
++
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
31 août 2004 à 14:53
if( scanf( "%f", &saisie) == EOF )
{
while( getc(stdin) != EOF );
continue;
}


mais avec un buffer c'est mieux, c'est plus logique
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
31 août 2004 à 14:48
ui, je C C mieu comme ça
j'aurai voulu voir sans passer par un buffer

un truc du style
scanf("%f", &saisie);
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
31 août 2004 à 14:39
pour le fopen je m'etais tromper (j'avais pas vu qu'il ecrivais d'abord dedans)


while(saisie!= 0)
{
printf("Tapez un nombre: ");
fflush(stdout);

fgets( buffer, sizeof buffer, stdin );

if( sscanf( buffer, "%f", &saisie) == EOF ) continue;

if(saisie != 0)
fprintf(fp,"%f\n", saisie);
}

de toute facon fflush(stdin) est une erreur
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
31 août 2004 à 14:30
djl> k
ceci po compris ton histoire de fopen

djl> saurais tu récupérer avec un scanf directement le nb???
ça marche po vraiement en fait

C pr ça que j'aV mis les fflush...

++
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
31 août 2004 à 14:28
oui, ok

le probleme avec les fonctions ato*, c'est que ca retourne 0 en cas d'erreur, on ne peut pas savoir si il y a reelement une erreur
cs_bethany Messages postés 26 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 15 mars 2005
31 août 2004 à 14:21
Bah le 0 fait sortir... :s
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
31 août 2004 à 14:15
je voulais juste dire de ne pas creer de blocs inutiles, ce ne peut que reduire la lisibilité du code ( ca sert surtout pour etablir ceraines regles de portées ou pour les structures de controles)

ne fais jamais fflush(stdin)


saisie=atof(buffer);
if(saisie != 0)
fprintf(fp,"%f\n", saisie);

0 est un entier, 0.0 est un double, et tu fais comment si justement le reel lu est 0 ? utilises plutot sscanf si tu veux gérer l'erreur pour de vrai

jamais de printf pour afficher une simple chaine (sans formatage), c'est plus rapide avec puts()
pareil pour fprintf(stderr, "..." ), fais plutot
fputs( "...", stderr)
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
31 août 2004 à 09:41
kikou

ce qu'il appelle des blocs c'est les jeux d'accolades...

Sinon, ça remarque n'est pas très explicite, je pense qu'il précisera exactement ce qu'il veux dire par là.

Pour ne pas te perturber, j'ai conservé la majorité de ton code d'origine et n'ai pas tout réécrit...

Bon, je passe ça par la moulinette MétaProg et je te donne un résultat qui ira encore mieu...

(seule modif manuelle : stderr...)

//MPBC_C	 fichier : 'miaou.cpp' traité par le MetaProgramme MétaProg de Bruno CELLE - vers 5.0.4
/// ----- MaJ le 31/08/04 : par bethany & magic_nono
/// ----- Créé le 30/08/04 : par bethany & magic_nono
/// ----- Objectif général : TODO
/// ----- Développé pour	: 1 exercice C...
/// ----- Chemin original  : C:\Documents and Settings\Luc\Bureau\miaou.cpp
/// ----- Nota: dans InOut peuvent être repérées des var In : aucun indice formel ne permet de noter le masquage du passage par parametre... ex : f(T i){i++;} a un effet différent si T:int ou "#define T int&".

#include <stdlib.h>
#include <stdio.h>
#define MAX 1024



main()
{
/// ----------------------------------------
/// ---------------- main() ----------------
/// ----------------------------------------
/// -----  Objectif	: Lanceur du projet
/// -----  Auteur(s)	: bethany & magic_nono 31/08/04
/// -----  PreCond	: /
/// -----  PostCond	: /
/// -----  Etat		: 1			(-1<0<1<2)
/// ----------------------------------------
/// -----  Var Internes à la fonction (3)	: buffer ,fp ,saisie
/// -----  Var Utilisées par adresse (1)	: buffer
/// -----  Var Masquées (2)	: buffer ,fp
/// -----  Var In  Globales Constantes (1)	: EOF

FILE*fp;
double saisie;
char buffer[512];
{
fp=fopen("C:\\fichier.txt","w");
if(fp == NULL)
{
fprintf(stderr,"Impossible d'ouvrir le fichier desire.\nVerifier que le fichier existe bien.");
return-1;
}
printf("\tSortie avec 0\n\n ");
while(saisie!= 0)
{
printf("Tapez un nombre: ");
fflush(stdout);
fflush(stdin);
fgets( buffer, sizeof buffer, stdin );
fflush(stdin);
fflush(stdout);
saisie=atof(buffer);
if(saisie != 0)
fprintf(fp,"%f\n", saisie);
}
fclose(fp);
}
{
fp=fopen("C:\\fichier.txt","r");
if(fp == NULL)
{
fprintf(stderr,"Impossible d'ouvrir le fichier desire.\nVerifier que le fichier existe bien.");
return-1;
}
while(fgets( buffer, sizeof buffer, fp))
{
saisie=atof(buffer);
printf("%f\n", saisie);
}
fclose(fp);
}
return 0;
}
cs_bethany Messages postés 26 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 15 mars 2005
31 août 2004 à 09:25
Bah ca va faire un an que je fais du C (sachant que je suis en alternance 2 mois 2 mois soit 6 mois de C avec 3 heures par semaines) et bien je sais ce qu'est fopen (la premiere fois qu'on l'ouvre faut bien écrire dedans, regarde bien) et le ffliush c'est écrit dans mon cours mais on ne l'a pas encore étudié !!!
Et j'avoue l'histoire des blocs, j'ai pas trop saisi, on a pas vu ca en cours !!!!
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
30 août 2004 à 18:31
bethany > tu fais du c depuis combien de temps ? parce que ca s'apprends pas en une semaine de cours...

pour moi les trucs du genre

fp=fopen("C:\\fichier.txt", "w"); (il faut ouvrir en lecture)
ou
fflush(stdin);
montrent qu'il y a encore quelques trucs que tu n'a pas compris

et ne créer pas de blocs inutilent ! (surtout sans savoir ce que ca implique)
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
30 août 2004 à 18:17
if(buffer[0]!=EOF)
est inutil

++
cs_bethany Messages postés 26 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 15 mars 2005
30 août 2004 à 18:12
J'ai modifié :)
c'est mieux ainsi :) ;)
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
30 août 2004 à 17:54
C clair
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 août 2004 à 17:41
Rappel:

ne pas confondre une source sur CS et un exercice perso. On dira qu'ici ça entrait dans la seconde categorie.

BruNews, Admin CS, MVP VC++
cs_bethany Messages postés 26 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 15 mars 2005
30 août 2004 à 17:26
Merci pour la source mais je ne comprend pas certaines choses, je vais les notées en vert sur ma source que je vais modifier maintenant...
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
30 août 2004 à 17:22
ben t'a la soluce, vire les com si tu ve


++
beth
cs_bethany Messages postés 26 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 15 mars 2005
30 août 2004 à 17:17
Et puis la je ne sais pas trop quoi garder, quoi virer... c'est pour ca que cela fait 'brouillon' ...
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
30 août 2004 à 17:16
soluce :


#include <stdlib.h>
#include <stdio.h>
#define MAX 1024
main()
{
FILE *fp; // pointeur sur le fichier a ecrire
double saisie; // var pour la saisie
char buffer[512];

{
fp=fopen("C:\\fichier.txt", "w");

if(fp == NULL)
{
printf("Impossible d'ouvrir le fichier desire.\nVerifier que le fichier existe bien.");
return -1;
}
printf("\tSortie avec 0\n\n ");

while(saisie!= 0) // boucle de saisie
{
printf("Tapez un nombre: ");
//
//if( sscanf( buffer, "%f" , &saisie ) == EOF ) continue;
fflush(stdout);
fflush(stdin);
//scanf("%f", &saisie); // on range saisie dans variable
fgets( buffer, sizeof buffer, stdin );

fflush(stdin);
fflush(stdout);
//if( scanf("%f", &saisie) == EOF )
// while( fgetc(stdin) != EOF );

saisie=atof(buffer);
if(saisie != 0) // si different de 0
{
fprintf(fp, "%f\n", saisie); // ecrirture du nombre dans le fichier
}
}
fclose(fp);
}

{
fp=fopen("C:\\fichier.txt", "r");
while(fgets( buffer, sizeof buffer, fp))
{
if(buffer[0]!=EOF)
{
// fscanf(fp, "%f", &saisie);
saisie=atof(buffer);
printf("%f\n", saisie);
}
}
fclose(fp);
}
return 0;

}

Voila
Magic_nono
cs_bethany Messages postés 26 Date d'inscription vendredi 2 avril 2004 Statut Membre Dernière intervention 15 mars 2005
30 août 2004 à 17:16
Mais j'en fais du c, t'es marrant toi !!!!

Oui j'ai pas vérif la 2eme fois l'ouverture, je demandais de l'aide parce que je voyais pas comment traiter le probleme...
Ya quelque petit truc que je connais pas super (genre nous en cours on avait vu le %5.2f par exemple et pas %0.f ),
mais ce n'est pas parce que j'y arrive pas super ke je connais pas le C, j'en connais une partie, et pas tout c sur...
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
30 août 2004 à 17:10
et 0.f en c, et verifie le mode d'ouverture du fichier et commence par apprendre le c (au moins quelques bases) car ca ne te servira a rien si on te donne le code tout cuit
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
30 août 2004 à 16:59
k tes comparaisons doivent etre pour des float
=> pas de guillemet !!!
Rejoignez-nous