Remplacer espace en retour à la ligne C

ahemd -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
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
A voir également:

3 réponses

crazycode Messages postés 35 Date d'inscription   Statut Membre Dernière intervention   2
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   185
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   185
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   185
 
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   Statut Contributeur Dernière intervention   1 846
 
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