Sous win32 & Dev-C++, Problème avec fputs()

FoLKeN91 Messages postés 9 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 24 janvier 2004 - 9 nov. 2003 à 13:32
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 - 9 nov. 2003 à 17:43
Bonjour
Comme dit dans le topic,
je suis sous windows 2k, je compile avec Dev-C++ 4.9.8.0, et je souhaite copier certaines lignes d'un fichier .txt dans un autre, pour ce, j'utilise fgets et ensuite fputs
ca compile très bien mais lorsque j'execute, le programme plante, et après plusieurs tests, j'ai remarqué que c'est au niveau de la fonction fputs(char *str, FILE *FileOut); que ca ne passe pas, voici les infos nécessaire de mon code (il n'y a pas tout ne vous inquietez pas :/ ) :

FILE *FileIn;
FILE *FileOut;
char *str;
int n=150;

FileIn = fopen("temp.txt", "r");
FileOut = fopen("day.txt", "w+");
str = (char *)malloc(sizeof(char)*n);
fgets(str,n,FileIn);
fputs(str,FileOut); // ERREUR A CE NIVEAU LA

15 réponses

FoLKeN91 Messages postés 9 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 24 janvier 2004
9 nov. 2003 à 13:33
Merci d'avance (j'en oublie ma politesse ^^)
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 nov. 2003 à 14:32
Salut,
Ce code marche tres bien chez moi.
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
9 nov. 2003 à 14:32
Tu pourrais essayer d'utiliser d'autres fonctions que ces deux, là, voici ton code avec les fonction fscanf et fprintf :

FILE *FileIn, *FileOut;
char *str;
// ligne qui a eviter de planter le prog si le fichier n'existe
// pas!if ( ( FileIn fopen( "temp.txt", "r" ) ) NULL )
{
printf( "Fichier introuvable!" );
return 1;
}if ( ( FileOut fopen( "day.txt", "w+" ) ) NULL )
{
printf( "Fichier introuvable!" );
return 1;
}

str = ( char * )malloc( sizeof( char ) );

if ( str == NULL )
printf( "Pas assez de RAM pour allouer!" );

// Seul problème = va copier tout le contenu du fichier!!!!
fscanf( FileIn, "%s", str );
fprintf( FileOut, "%s", str );

Et voilà je crois que ce n'est pas trop compliqué! tu peux aussi utiliser les fonctions fread et fwrite, mais je n'aime pas moi! mais en tout cas une chose à dire: le "w+" dans fopen, à chaque fois que le fichier sera ouvert avec le programme, son contenu sera entièrement effacé!!!

Essaye toujours ce que je t'ai donné sinon pose une question encore plus précise ;)

Bonne prog!

[DmX]
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 nov. 2003 à 14:36
Salut,
A mon avis le prob vient d'autre part ou alors de Dev c++, car moi j'ai compilé avec 0 erreur 0 warning sous visual c++, et le prob marche impec.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
FoLKeN91 Messages postés 9 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 24 janvier 2004
9 nov. 2003 à 14:57
je viens d'essayer avec le fprintf, et le résultat est pareil, il doit y avoir une seg fault quelque part (c'est dommage que sous windows, je ne puisse pas bien cibler les erreurs).
Je vais tenter d'expliquer un peu plus mon code :

J'ai un fichier temp.txt qui se fait pointer par FILE *FileIn (pour tous les fopen() j'ai deja fait les tests comme il se doit). Je souhaite faire une fonction permettant de trier dans ce fichier quelques lignes selon des balises (qui sont des strings), voici un bout de mon code :

/*Ces balises correspondent à des lignes entières dans le temp.txt */
char BaliseDay[28]={"ftp> quote site stats daydn"};
char BaliseWeek[29]={"ftp> quote site stats weekdn"};
char BaliseAll[28]={"ftp> quote site stats alldn"};
char BaliseSuccess[24]={"200 Command successful."};
FILE *FileIn; // qui pointe déjà sur le bon fichier temp.txt (partie réalisée ailleurs dans le code)

/* Fonction qui lit un fichier et trie les données comme convenu */
void Triage(FILE *FileOut, char balise[])
{
char *str;
int n=150;
str = (char *)malloc(sizeof(char)*n);
fgets(str,n,FileIn);

while (strcmp(str,balise) != 0)
{
fgets(str,100,FileIn);
printf("%s\n",str);
}
while (strcmp(str,BaliseSuccess) != 0)
{
fputs(str,FileOut);
fgets(str,100,FileIn);
printf("%s\n",str);
}
}

/* DANS LE MAIN */
FILE *Day;
FILE *Week;
FILE *AllTime; // tous pointent vers le bon fichier a l aide de fopen()

Triage(Day,BaliseDay);
Triage(Week,BaliseWeek);
Triage(AllTime,BaliseAll);
0
FoLKeN91 Messages postés 9 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 24 janvier 2004
9 nov. 2003 à 15:07
en effet le ptit bout de code que j'ai mis en topic marche bien, c'est pour ca que je montre toute la fonction. montrer toute la fonction
en tout cas je vous remercie pour votre aide, j'en ai marre d'etre bloqué sur une telle erreur pour un prog assez simple :)
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 nov. 2003 à 15:10
Salut,
Comment ouvres tu les fichiers ? enfin en quel mode ("w", "a", etc..). A mon avis le prob vient de la.
0
FoLKeN91 Messages postés 9 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 24 janvier 2004
9 nov. 2003 à 15:19
FILE *FileIn;

int CreatesFile(FILE *fin, char *filename, char *MessageErreur)
{
fin = fopen(filename, "w+");
if ( fin == NULL )
{
printf("%s\n",filename);
MessageErreur = (char *) malloc(sizeof(char) * 36);
strcpy(MessageErreur,"Ecriture impossible dans ce fichier");
ErreurProg(MessageErreur);
}
return 0;
}

/* DANS LE MAIN */
FILE *Day;
FILE *Week;
FILE *AllTime;
char *MessageErreur;
char *filename;

/* Ouvre FileIn => temp.txt
FileIn = fopen("temp.txt", "r");
if ( FileIn == NULL )
{
MessageErreur = (char *) malloc(sizeof(char) * 40);
strcpy(MessageErreur,"Impossible d'ouvrir le fichier temp.txt");
ErreurProg(MessageErreur);
}

// fais le tri de DAY
filename = (char *)malloc(sizeof(char)*8);
strcpy(filename,"day.txt");
CreatesFile(Day,filename,MessageErreur);
Triage(Day,BaliseDay);
free(filename);

// fais le tri de WEEK
filename = (char *)malloc(sizeof(char)*9);
strcpy(filename,"week.txt");
CreatesFile(Week,filename,MessageErreur);
Triage(Week,BaliseWeek);
free(filename);

// fais le tri de ALLTIME
filename = (char *)malloc(sizeof(char)*12);
strcpy(filename,"alltime.txt");
CreatesFile(AllTime,filename,MessageErreur);
Triage(AllTime,BaliseAll);
free(filename);

// PS: j'ai aussi essayé avec "w" mais cela revient au même, il faut savoir que seul temp.txt existe initiallement, il faut créer les 3 autres fichiers, cad day.txt week.txt all.txt
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 nov. 2003 à 15:50
Salut,
Dans ta fonction CreatesFile(...):
Tu ne modifie pas ce qui est pointé par fin, mais directement fin. Il faut donc passer un pointeur vers fin pour etre capable de le modifier dans ta fonction. Mais comme fin est deja un pointeur, il faut passer un pointeur sur pointeur en param dans ta fonction CreatesFile(...).
Le descripteur fin sera invalide, voila pourquoi fputs et fprintf ne fonctionnaient pas.

Sinon autre probleme:
while (strcmp(str,balise) != 0)

Cette condition sera VRAI lorsque les chaines str et balise sera differentes, c'est bien ce que tu veux ?
0
FoLKeN91 Messages postés 9 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 24 janvier 2004
9 nov. 2003 à 16:01
désolé je débute tout juste en programmation, et je viens d'apprendre hier les flux d'E/S donc je ne maîtrise pas vraiment.
Pour le problème de la boucle, en effet elle ne marche pas, mais meme avec ==0, je pense qu'il faut d'abord résoudre le pb du pointeur de fichier.
je n'ai pas tout compris à ton explication même si elle semble claire. pourrais tu me le traduire en code que je comprenne mieux ? en modifiant la fonction CreatesFiles(...) et les appels dans le main, merci beaucoup :)
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 nov. 2003 à 16:15
Salut,
Honnetement, le mieux et d'ouvrir tes 3 fichiers en sortie depuis la fonction Main, et tu aura pas de probleme. Ici, les pointeurs sur pointeurs c'est de la difficulté inutile.
Ca aurait donné un truc comme ca:

int CreatesFile(FILE ** fin, char *filename, char *MessageErreur)
{
*fin = fopen(filename, "w+");
if ( fin == NULL )
{
printf("%s\n",filename);
MessageErreur = (char *) malloc(sizeof(char) * 36);
strcpy(MessageErreur,"Ecriture impossible dans ce fichier");
ErreurProg(MessageErreur);
}
return 0;
}

Et pour appeller la fonction:
FILE * Day;
CreatesFile(&Day, ..., ...);
0
FoLKeN91 Messages postés 9 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 24 janvier 2004
9 nov. 2003 à 16:34
Merci ca marche maintenant. En effet c'est une fonction un peu inutile mais si par la suite dans mon prog je rajoute d'autres fichiers, ca pourra etre pratique. Puis apres je vais devoir faire des log de tous les txt en fonction de la date...
sinon maintenant mon probleme c'est la boucle, je voudrais qu'il fasse la premiere boucle pour arriver a la balise de début. Par exemple, dans le cas de day.txt :
dès que dans le temp.txt il atteint ca :
"ftp> quote site stats daydn" ( balise)
il commence à copier (c'est la deuxieme boucle) dans le day.txt jusqu'a ce qu'il atteigne :
"200 Command successful." (BaliseSuccess)

d'où les !=0
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 nov. 2003 à 16:52
Salut,
Alors, fgets(...) lis le fichier jusqu'a la fin de la ligne, et rajoute un zero a la fin. Seulement, avant le 0, il laisse le caractere '\n', qui est le caractere "nouvelle ligne".
Donc il faut comparer les 2 chaines sauf le dernier caractere de str.

while(strncmp(str,balise, srtlen(balise)) != 0)

strlen(balise) retourne la longueur de balise, t la comparaison des 2 chaines ne se fera que sur cette longueur.
En théorie, ca devrait aller...
J'attend les resultats.
0
FoLKeN91 Messages postés 9 Date d'inscription dimanche 9 novembre 2003 Statut Membre Dernière intervention 24 janvier 2004
9 nov. 2003 à 17:29
yeah !
aardman tu assures :)
ca marche enfin
j'ai tout de meme du modifier deux trois trucs mais c'est bon maintenant, il me reste plus qu'a inscrire les noms de fichiers en fonction de dates et les logger, c'est parti \o/
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
9 nov. 2003 à 17:43
Salut,
Ca fait toujours plaisir quand ca marche.
Bonne chance pour la suite.
0
Rejoignez-nous