IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème fichier en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 76
    Par défaut Problème fichier en C
    Bonjour,
    Je suis entrain d'écrire une petite fonction, mais j'ai une erreur que je n'arrive pas à identifié,

    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    void ExtractAudioFileAndGrammar(char **AudioFile,char **Grammar,char **GrammerFileName)  {
     
    struct dirent *lecture;
        DIR *rep;
        char *DefaultDirectoryPath="/tmp/mondir/";
        char GrammarPath[255];
        FILE * FLOG;
     
            FLOG=fopen("log.txt","w");
       if(FLOG!=NULL)  fprintf(FLOG,"je suis au debut\n");
        rep = opendir("/tmp/mondir");
        while ((lecture = readdir(rep))) {
     
           if (strstr(lecture->d_name,".ulaw"))
                    {
            *AudioFile=lecture->d_name;
           if(FLOG!=NULL)  fprintf(FLOG,"je suis dans la fonction ExtractAudioFileAndGrammar 1\n");
     
     
                    }
     
     
            if (strstr(lecture->d_name,".txt"))
                    {
     
                   strcpy(GrammarPath,DefaultDirectoryPath);
                    strcat(GrammarPath,lecture->d_name);
     
     
                    FILE * f = fopen(GrammarPath, "r");
                    if(f == NULL){
                       if(FLOG!=NULL) fprintf(FLOG,"erreur\n");
                         fclose(FLOG);
                         }
                    else{
     
                         if(FLOG!=NULL) fprintf(FLOG,"je suis dans la fonction ExtractAudioFileAndGrammar4 \n");
                         if(FLOG!=NULL) fprintf(FLOG,"je suis dans la fonction ExtractAudioFileAndGrammar 5\n");
                             fscanf(f,"%s",Grammar);
                         if(FLOG!=NULL) fprintf(FLOG,"je suis dans la fonction ExtractAudioFileAndGrammar 3\n");
                         if(FLOG!=NULL) fprintf(FLOG,Grammar);
                         if(FLOG!=NULL)fprintf(FLOG,"\n");
                         *GrammerFileName=basename(*Grammar); // je sais que l'erreur vient apparament de cette ligne car si j'enlève tout le reste j'ai bien mes fprintf dans le fichier sinon j'ai un fichier vide 
                         if(FLOG!=NULL)fprintf(FLOG,GrammerFileName);
                         if(FLOG!=NULL)fprintf(FLOG,"\n");
                          fclose(FLOG);
                          fclose(f);
                       }
     
     
                    }
     
            }
        closedir(rep);
    }

    Voila merci de m'aider ça fait un jour et demi que je suis dessus et ça m'a pris la tête en plus c'est sur que c'est une erreur débile

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    44  *GrammerFileName=basename(*Grammar); // je sais que l'erreur vient apparament de cette ligne car si j'enlève tout le reste j'ai bien mes fprintf dans le fichier sinon j'ai un fichier vide
    Si l'erreur vient de cette ligne, on ne peut rien dire :
    - on ne connait pas la fonction basename
    - GrammerFileName et Grammar sont tous deux des paramètres de la fonction et on n'a aucune idée comment ils ont été initialisés

    Par contre, ceci est bizarre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    40  fscanf(f,"%s",Grammar);
    Grammar devrait être alors l'adresse de début d'un tableau de char, un char*, or c'est un char**, l'adresse de début d'un tableau de pointeur sur char. Pas normal !

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 76
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    44  *GrammerFileName=basename(*Grammar); // je sais que l'erreur vient apparament de cette ligne car si j'enlève tout le reste j'ai bien mes fprintf dans le fichier sinon j'ai un fichier vide
    Si l'erreur vient de cette ligne, on ne peut rien dire :
    - on ne connait pas la fonction basename
    basename est une fontion C
    - GrammerFileName et Grammar sont tous deux des paramètres de la fonction et on n'a aucune idée comment ils ont été initialisés

    touts les parmètres sont initialisés dans le main comme un char *

    Par contre, ceci est bizarre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    40  fscanf(f,"%s",Grammar);
    cela est exact, j'avais essayé avec un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    40  fscanf(f,"%s",*Grammar);
    mais j'avais le même problème



    Grammar devrait être alors l'adresse de début d'un tableau de char, un char*, or c'est un char**, l'adresse de début d'un tableau de pointeur sur char. Pas normal !

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    -
    basename est une fontion C

    -
    touts les parmètres sont initialisés dans le main comme un char *
    Alors, c'est faux puiqu'ils sont déclarés en paramètres comme des char**, et pas comme des char*.
    -
    cela est exact, j'avais essayé avec un ....
    Ce n'est pas du codage aléatoire qu'il faut faire.

    - Il faudrait peut être montrer ce fameux main() qui appelle cette fonction ExtractAudioFileAndGrammar().

    - PS : ne pas inclure les réponses dans une grosse citation, c'est difficilement lisible, mais fractionner la citation :
    [QUOTE ]question[/QUOTE ]
    réponse à cette question
    [QUOTE ]question[/QUOTE ]
    réponse à cette question
    ....

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 76
    Par défaut
    Bon je vais montrer mon main :p il est un peu gros c'est pour ça que je n'ai pas voulu le montrer dès le début

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
     main(void)
    {
        char *lenstr;
        char input[MAXINPUT], data[MAXINPUT];
        long len;
    	char *AudioFile;
    	char *Grammar;
    	char *GrammerFileName;	
    	char GrammarPath[255]; 
    	char DefaultAudioFilePath[255];
    	char *DefaultDirectoryPath="/tmp/mondir/";
    	char *CurrentGrammarPath="/var/www/cgi/"; 	
    	char ExtarctCommand[40];
    	char **buf = NULL;
    	int rc;
    	char *result;	
    	int i = 0;
    	char *XMLResult="<?xml version='1.0' encoding='UTF-8'?><vxml version='2.0'><form><block><var name='ResultASR' expr='RecoRes'/><return namelist='ResultASR'/></block></form></vxml>";	
    		
    	/*
    	calculate the size of informations placed in the input stream
    	*/
    	FILE * test;
             
          
    
            
    
            lenstr = getenv("CONTENT_LENGTH");
            if(lenstr == NULL)
                    PrintHTMLHeaderAndMessage(500,"lentstr problem\n");
            else if ( sscanf(lenstr,"%ld",&len)!=1)
                    PrintHTMLHeaderAndMessage(500,"error sscanf.\n");
            else if ( len > MAXLEN)
                    PrintHTMLHeaderAndMessage(500,"len et MAXLEN prob.\n");
            else
            {
                    FILE * f;
                    /*
    		delete old toto.mul file if it exist.
    		*/
                    if(f=fopen("toto.mul", "a"))
    		{
      			fclose(f);
    			system("rm toto.mul");
    			
    		}
    		/* ompen the toto.mul file */
    		f = fopen("toto.mul", "a");
                    if(f == NULL){
                            PrintHTMLHeaderAndMessage(500,"Sorry, cannot store your data.\n");
                            perror("You goofed!");
                            printf("errno = %d.\n", errno);
                    }
                            else
                    {
    
    			/*
    			read and copy informations posted by the user int the toto.mul file 	
    			*/				
    			int bytes_read = fread(input, sizeof(char),len+100,stdin); 
    			
    			if(bytes_read > 0) 
    			{	 
     				fwrite(input, sizeof(char), bytes_read,f); 
      				bytes_read = fread(input, sizeof(char),len+100,stdin); 
    			} 
    			 fclose(f);
    	
    
    			/*
    			Executing the extractmulitpart Script: extracting all useful data
    			posted by the user( AudioFile and Grammar) without Mime header.	
    			*/
    			system("extractmultipart /tmp/mondir/%s < toto.mul");		
    			
    			/*
    			Finding the full name of the AudioFile and the Grammar 
    			uploaded on the server by the user.		
    			*/
    			
    			ExtractAudioFileAndGrammar(&AudioFile,&Grammar,&GrammerFileName); 
    			test=fopen("test.txt","w");
    			if(test==NULL)
    			{
                             printf("erreur");
    			}
    			else{
    			fprintf(test,Grammar);
    			fclose(test);
                           }
    			/*
    			Downloading the grammar	
    			*/
    			 strcat(ExtarctCommand,"wget");
    			 strcat(ExtarctCommand," ");
    			 strcat(ExtarctCommand,Grammar);
    			 system(ExtarctCommand);
    			
                           /*constuction of the path of grammar*/
    			strcpy(GrammarPath,CurrentGrammarPath);
    			strcat(GrammarPath,GrammerFileName);
    			/* 
                            Construction of the AudioFile real Path on the disc
                            */
    			strcpy(DefaultAudioFilePath,DefaultDirectoryPath);
                            strcat(DefaultAudioFilePath,AudioFile);
    
    			/*
    			 Initialising all needed server parmaters for recognition 
    			*/
    		 	int res=nc_init();
    
    			/*
    			 Loading grammar for the recognition process
    			*/
    			res=set_param("load_grammar",GrammarPath);
    			/*
    			Starting the recognition
    			*/
    			if(AudioFile)
    			{
    			printf ("\n Calling Reconize.\n");
    			result=reconize(DefaultAudioFilePath);
    			printf("%s\n",result);
    			result =XMLParser("SWI_literal",result);
                            replace(XMLResult,"RecoRes",result);  
    	                 /*just for testing*/
                            PrintXMLHeaderAndMessage(200,XMLResult);			
    
    		 	}	
    			else{
    			printf("audio file missing");
    			return 0;
    			}
    			/*
    			close all ressources	
    			*/
                            nc_close();
    			/*
    			 Delete the temporary AudioFile and Grammar.
    			*/
    			system("rm -f /tmp/mondir/*" );
                    
    
    		}
            }
            return 0;
    }

    ensuite voici un lien vers la définition de la fonction basename :

    http://www.linux-perl-c.lami20j.fr/c...n-d-acces.html.


    J'ai réalisé aussi une petite fonction de test qui fonctionne très bien :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <dirent.h>
    #include <malloc.h>
    #include <string.h>
     
     
    void ExtractAudioFileAndGrammar(char **AudioFile,char **Grammar,char **GrammerFileName)
    {
     
     *Grammar="http://lol/xptdr/essaie.grxml";
      printf("lol\n");
      printf("%s\n",*Grammar);
      *GrammerFileName=basename(*Grammar);
      printf("%s\n",*GrammerFileName);
     
    }
     
     
    int main()
    {
    char *AudioFile;
    char *Grammar;
    char *GrammerFileName;
     
     
     ExtractAudioFileAndGrammar(&AudioFile,&Grammar,&GrammerFileName);
     
    return 0;
    }

    Le résultat d'exécution de cette fonction est :

    [root@l-at6379 nuance_connector]# ./a.out

    lol
    http://lol/xptdr/essaie.grxml
    essaie.grxml




    Je sais que je devrais pas faire au pif mais j'ai craqué à un moment et j'ai essayé de bidouillé pour avoir un résultat

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Grammar n'est pas initialisé...

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ExtractAudioFileAndGrammar(char **AudioFile , char ** Grammar , char **GrammerFileName)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(f,"%s",Grammar);

    Ca va faire deux dommages collatéraux : tu vas écraser la valeur du pointeur se trouvant dans la fonction appelante (dont son adresse a été passée en argument, d'où le pointeur de pointeur) et, par débordement, écraser d'autres de ses variables locales.
    Puis lorsque tu dérérérences, tu vas te retrouver avec une adresse bidon et ça va de toute façon crasher ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *GrammerFileName=basename(*Grammar)

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Août 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 76
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ExtractAudioFileAndGrammar(char **AudioFile , char ** Grammar , char **GrammerFileName)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(f,"%s",Grammar);
    exact ce que tu viens de dire est juste, mais j'avais essayé avec plusieurs version dont une est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(f,"%s",*Grammar);
    Cela éviterais d'écraser la valeur du pointeur. Mais j'avais toujours le même problème


    Ca va faire deux dommages collatéraux : tu vas écraser la valeur du pointeur se trouvant dans la fonction appelante (dont son adresse a été passée en argument, d'où le pointeur de pointeur) et, par débordement, écraser d'autres de ses variables locales.
    Puis lorsque tu dérérérences, tu vas te retrouver avec une adresse bidon et ça va de toute façon crasher ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *GrammerFileName=basename(*Grammar)

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    exact ce que tu viens de dire est juste, mais j'avais essayé avec plusieurs version dont une est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(f,"%s",*Grammar);
    Cela éviterais d'écraser la valeur du pointeur. Mais j'avais toujours le même problème
    Il ne faut pas "faire du pifomètre jusqu'à ce que ça marche", c'est dangereux.
    Selon le prototype de ta fonction, Grammar a pour valeur l'adresse d'un autre pointeur. Et lui a pour valeur une adresse correspondant à une zone mémoire pouvant accueillir ta chaine de caractères. Si cette zone n'est pas autorisée pour la lecture ou l'écriture, ça va crasher. Il faut donc vérifier. Et là, on ne peut hélas pas t'aider davantage car on n'a pas le code de ta fonction appelante.

Discussions similaires

  1. problème fichier usbehci.sys manquant
    Par brotelle dans le forum Ordinateurs
    Réponses: 2
    Dernier message: 02/04/2006, 10h01
  2. [MySQL] upload : problème fichiers existants dans la bdd ?
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/02/2006, 11h29
  3. problème fichier devpak
    Par Myra67 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 30/06/2005, 22h26
  4. [résolution de noms] [réseau] problème fichier hosts
    Par Aldo dans le forum Administration
    Réponses: 2
    Dernier message: 11/04/2005, 21h38
  5. [Debutant(e)] Problème fichier texte et vue
    Par solenn dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 21/07/2004, 09h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo