Remplacer espace en retour à la ligne C

Fermé
ahemd - 10 févr. 2011 à 21:34
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 12 févr. 2011 à 00:06
Bonjour,


Salut.
Je veux remplacer les espaces dans mon fichier en retour à la ligne j'ai fait cette manipulation
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void sauvegarde(char *chaine[], int taille, char nomfichier[50])
{
FILE* fichier;
int i;
char *position;
printf("Indiquez un nom du fichier\t");
fgets(nomfichier, 50,stdin);
fichier = fopen(nomfichier,"w");
if(fichier!=NULL)
{
printf("Veuillez saisir le contenu \t");
fgets(chaine,taille,stdin);
fprintf(fichier,"%s",chaine);
fclose(fichier);
}
fichier = fopen(nomfichier,"r+");
if(fichier!=NULL)
{
    if(fgets(chaine,taille,stdin)!=NULL)
    {
        position=strchr(chaine,'\0');
        if(position!=NULL)
           {
               *position='\n';
           }
           return 1;
    }
fclose(fichier);
}
}
int main()
{
char chaine[100],nomfichier[50];
sauvegarde(chaine,100,nomfichier);

}

Le probléme c'est que ça ne marche pas

3 réponses

crazycode Messages postés 35 Date d'inscription jeudi 20 janvier 2011 Statut Membre Dernière intervention 10 février 2011 2
10 févr. 2011 à 21:55
déja tu ne cherches pas espace mais fin de chaine
position=strchr(chaine,'\0');

à remplacer par

position=strchr(chaine,' ');

après l'algo je n'est pas vérifié
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 févr. 2011 à 22:21
J'ai pas tout lu, mais ya pas mal de fautes.
Tu mets dans le prototype de ta fonction sauvegarder :
char *chaine[]
Alors que chaine est définie en : char chaine[100];

fgets(nomfichier, 50,stdin);
fichier = fopen(nomfichier,"w");

Attention, fgets te stockera le retour chariot '\n' à la fin de la chaîne s'il a la place. Donc ton nom de fichier sera bizarre. Il faut donc remplacer le '\n' par '\0' (tu peux t'aider de strchr).

position=strchr(chaine,'\0');
Si tu fais ça, tu vas rechercher le caractère terminal. Cela renverra NULL;
Toi ce que tu souhaites, c'est rechercher les espaces dont le code ascii est ' '. Après, à toi de voir si tu veux tous les remplacer ou pas. Dans ce cas, il faudra réaliser une boucle while.
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
10 févr. 2011 à 23:03
Salut,
tu as vérifié tes warnings de compilation ? Avec gcc, j'ai ça :
.\newline.c: In function 'sauvegarde':
.\newline.c:15: warning: passing arg 1 of 'fgets' from incompatible pointer
 type
.\newline.c:22: warning: passing arg 1 of 'fgets' from incompatible pointer
 type
.\newline.c:24: warning: passing arg 1 of 'strchr' from incompatible pointe
r type
.\newline.c:29: warning: 'return' with a value, in function returning void
.\newline.c: In function 'main':
.\newline.c:37: warning: passing arg 1 of 'sauvegarde' from incompatible po
inter type


Pour les 3 premiers, il suffit de retirer soit [] soit * à ton paramètre chaine. Pour le return, je pense que c'est une inattention de ta part, sa place est bien sûr dans le main. Le dernier part une fois que tu as corrigé le paramètre chaine.

Perso j'ai eu un problème avec tes fgets qui utilisent stdin, il y avait un saut de ligne qui s'incrustait. Un dump de ce genre :
printf("[%s]\n", nomfichier);

m'affichait des trucs comme :
[test
]

Tu vois le genre. Je te conseille d'utiliser simplement gets, au moins pour le nom de fichier.

Au niveau de ton second fopen, je ne comprends pas du tout ce que tu cherches à faire :/ On dirait que tu oublies d'inscrire des choses dans le fichier... Tu récupères juste une chaîne depuis stdin, tu la modifies mais tu n'en fais rien ensuite.

En fait j'ai juste l'impression que tu as codé trop vite, ou alors que tu étais fatigué ^^
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 févr. 2011 à 23:07
Tu vois le genre. Je te conseille d'utiliser simplement gets, au moins pour le nom de fichier.
Mauvais conseil ^^. Non seulement, tu n'indiques pas la taille (fonction à éviter) et en plus le '\n' vient également se stocker. Lorsqu'on utilise fgets, il suffit de remplacer le '\n' au moyen de strchr. Ou alors, on peut utiliser scanf("%49s",nomfichier); comme ça pas besoin de retirer le '\n'.
Cdlt,
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
11 févr. 2011 à 00:13
Bien vu le scanf, par contre je pense qu'il n'y a pas besoin de faire -1 sur la taille.

Ok, alors un truc comme ça pour que ça soit dynamique :
char format[6];
strcpy(format, "%");
char temp[4];
strcat(format, itoa(taille, temp, 10)); 
strcat(format, "s");

scanf(format, nomfichier);

Pfiou... ^^
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
11 févr. 2011 à 23:20
Bien vu le scanf, par contre je pense qu'il n'y a pas besoin de faire -1 sur la taille.
Si, il y en a besoin.

Pfiou... ^^
Ou plus simplement : sprintf(format,"%%%ds",taille-1);

Cdlt,
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
11 févr. 2011 à 23:44
Tu peux expliquer du coup l'histoire du -1 ? Parce que j'ai mis 50 et j'ai quand même pas de saut de ligne, du coup je vois pas ^^
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 12/02/2011 à 00:07
arce que j'ai mis 50 et j'ai quand même pas de saut de ligne
Normal, le format "%s" ne prend pas le retour chariot.

Tu peux expliquer du coup l'histoire du -1 ?
Lorsque tu mets "%5s", scanf va lire 5 caractères et mettre le caractère terminal juste après. Ce qui fera 6 caractères au total, et donc un petit stack overflow (ou heap overflow s'il s'agit d'un pointeur).
0