Aide en c

Fermé
poratokouetha Messages postés 1 Date d'inscription lundi 25 août 2014 Statut Membre Dernière intervention 25 août 2014 - 25 août 2014 à 13:06
 poratokouetha - 26 août 2014 à 10:24
bonsoir,jai un soucis dans mon programme ,bref jaimerai ecrire un programe qui lit un fichier, le separe grace a la virgule et le stoke dans un autre fichier destinataire par exemple:

1) sante,social,ebola ne connait pas le racisme.

le fichier atendu (fichier destinataire) sera le comme suite:

sante:ebola ne connait pas le racisme.

social:ebola ne connait pas le racisme.

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
25 août 2014 à 13:53
Bonjour,

Il faudrait poster ton programme pour qu'on puisse t'aider.
Utilise les balises "code c" pour le poster.
Exemple :
<"code c">/*ici tu mets ton code*/<"/code"> (sans les guillemets).
Cdlt,
0
poratokouetha
25 août 2014 à 18:10
ok fiddy voici le code et le fichier source

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


int main ( int arg, char* argv[]){

/* Declaration des variables*/
char c;
int b, tab[1000];
int i;
char srce[1000],desti[1000];
char seps[] =",";/* note d'espace de caratere*/
char *token = (char*)malloc(sizeof(char)*1000) ;
char *string = (char*)malloc(sizeof(char)*1000) ;
char** tabString = (char*)malloc(sizeof(char*)*100) ;;

/*Allocation de l'espace memoire*/
for(i = 0; i <100; i++)
*(tabString + i) = (char*)malloc(sizeof(char)*1000) ;

printf(" Entrer le nom du fichier source:");
scanf ("%s",srce);

/* ouverture du fichier de lecture*/

FILE *src=fopen(srce,"r");

/* on teste si ca existe*/

if(src==NULL){
printf ("il n'existe pas le fichier %s \n",srce);
return 0;
}

/*ouverture du fichier destinataire*/

printf("entrer le fichier destinataire:");
scanf("%s",desti);

FILE *dest=fopen (desti,"w+");

/*operation de separation*/

// token=strtok(string,seps);
int cpt = 0; b=1;

while (! feof(src)){
fgets(token, 1000, src);
string = strtok( token, seps );
while( string != NULL ){
strcpy(*(tabString + cpt), string);
string = strtok( NULL, seps );
cpt++;
}
b = cpt-1;
//char *token1 = (char*)malloc(sizeof(char)*1000) ;
for(i = 0; i < cpt-1; i++){
char *token1 = (char*)malloc(sizeof(char)*1000) ;
strcat(token1, *(tabString + i));
strcat(token1, ":");
strcat(token1, *(tabString + b));
strcat(token1, "\n");
printf(" %s \n", token1);
fputs(token1, dest);
free(token1);
}
}

//fputs (c ,dest);
/*on ferme les descripteur*/
fclose (src);
fclose (dest);
b = getchar();

return 0;

}


0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
25 août 2014 à 21:31
Ce n'est pas les balises "code" que j'ai demandé mais "code c" comme dans mon exemple. Ca mettra les couleurs en plus :-).
Sinon, pourrais-tu décrire précisément le problème que tu obtiens, ça nous aiderait beaucoup.

Déjà, ce que je vois comme petit problème :

char** tabString = (char*)malloc(sizeof(char*)*100) ;;
Pas besoin de 2 points-virgules.
Le cast n'est pas correct. Il faut mettre (char**). Mais le cast est superflu en C puisque le type de malloc est void*. Exemple :
char **tabString = malloc(sizeof(char*) * 100);


*(tabString + i)
Pour info, tu peux utiliser tabString[i] qui est plus condensé.

while (! feof(src)){
Attention, feof() ne permet pas de détecter la fin de fichier. Il faut plutôt lire le fichier et vérifier si elle retourne une erreur ou pas.

strcat(token1, *(tabString + i));
token1 a besoin de contenir un '\0'. Il faut donc le mettre après ton malloc().

Petite question : pourquoi utilise de l'allocation dynamique (malloc) avec une taille statique ? Du coup, il ne faut pas oublier tous les free() qui vont bien pour libérer les zones allouées.

b = getchar();
getchar(); tout simplement suffit.

Cdlt,
0
poratokouetha
26 août 2014 à 09:50
 #include<stdio.h>
#include<string.h>
#include<stdlib.h>


int main ( int arg, char* argv[]){

/* Declaration des variables*/
    char c;
    int b, tab[1000];
    int i;
    char srce[1000],desti[1000];
    char seps[] =",";/* note d'espace de caratere*/
    char  *token = (char*)malloc(sizeof(char)*1000) ;
    char *string = (char*)malloc(sizeof(char)*1000) ;
    char** tabString = (char*)malloc(sizeof(char*)*100) ;;

    /*Allocation de l'espace memoire*/
    for(i = 0; i <100; i++)
        *(tabString + i) = (char*)malloc(sizeof(char)*1000) ;

    printf(" Entrer le nom du fichier source:");
    scanf ("%s",srce);

    /* ouverture du fichier de lecture*/

    FILE *src=fopen(srce,"r");

/* on teste si ca existe*/

    if(src==NULL){
        printf ("il n'existe pas le fichier %s \n",srce);
        return 0;
    }

    /*ouverture du fichier destinataire*/

    printf("entrer le fichier destinataire:");
    scanf("%s",desti);

    FILE *dest=fopen (desti,"w+");

    /*operation de separation*/

    // token=strtok(string,seps);
    int cpt = 0; b=1;

    while (! feof(src)){
        fgets(token, 1000, src);
        string = strtok( token, seps );
        while( string != NULL ){
            strcpy(*(tabString + cpt), string);
            string = strtok( NULL, seps );
            cpt++;
        }
        b = cpt-1;
        //char  *token1 = (char*)malloc(sizeof(char)*1000) ;
        for(i = 0; i < cpt-1; i++){
            char  *token1 = (char*)malloc(sizeof(char)*1000) ;
            strcat(token1, *(tabString + i));
            strcat(token1, ":");
            strcat(token1, *(tabString + b));
            strcat(token1, "\n");
            printf(" %s \n", token1);
            fputs(token1, dest);
            free(token1);
          }
      }

    //fputs (c ,dest);
    /*on ferme les descripteur*/
    fclose (src);
    fclose (dest);
    b = getchar();

    return 0;

}

mon veritable proble est que lorsque jentre mon fichier le programe decoupe la premiere ligne mais ne decoupe pas le reste
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 26/08/2014 à 10:17
Je ne vois pas les corrections des points que je t'ai signalés...
0
poratokouetha
26 août 2014 à 10:24
je suis entrain de corriger ca fiddy
0