Remplacer espace en retour à la ligne C

ahemd -  
fiddy Messages postés 441 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

3 réponses

  1. crazycode Messages postés 26 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
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
  3. Groarh Messages postés 706 Statut Membre 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
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    2. Groarh Messages postés 706 Statut Membre 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
    3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    4. Groarh Messages postés 706 Statut Membre 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
    5. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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