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 :

pb avec mon fgets


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut pb avec mon fgets
    Bonjour, j'ai un segmentation fault, et j'ai repéré la fonction qui ne va pas.
    Pendant mon prgm, je calcule tout un tas de choses que j'écris ensuite dans un fichier "sorties.dat".
    Chaque ligne de ce fichier contient N+2 colonnes (je connais la valeur de N)

    L'idée de la fonction qui pose pb est qu'elle lit toutes ces sorties pour calculer ensuite la pression du moteur à chaque instant. Donc je parcours toutes les lignes, et à chaque ligne je calcule la pression puis je l'écris dans un autre fichier de sortie ("pressions.dat"), puis je passe à la ligne suivante.

    voici ma fonction

    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
     
    void CalculPression(char * name_file,char * name_file_out,Engine * e,Species ** TabSpecies,double m,double R,unsigned int length)
    {
        /* cette routine calcule la pression du systeme a l'instant t.
           
           name_file est un fichier qui contient les sorties a chaque instant.
           Chaque ligne de name_file est constitue du temps t, des fractions
           massiques de chaque espece et de la temperature
     
           name_file_out est le fichier de sortie dans lequel sera ecrite la pression en
           Pa
     
           e contient les caracteristiques du moteur
     
           TabSpecies contient toutes les donnees de chaque espece
     
           m est la masse du melange en g
           R est la constante des gaz parfaits en erg/(mol K)
     
           length est la longueur du vecteur y (donc length = nombre especes + 2)
         */
     
        /* ouverture du fichier d'ecriture de la pression */
        FILE * fileOutput = fopen(name_file_out, "w+");
     
        /* ouverture du fichier de sorties */
        FILE * file=fopen(name_file,"r");
        if (file==NULL)
        {
    	fprintf(stderr,"Error in file %s line %d in function %s : file %s wasn't found\nExit program\n",__FILE__,__LINE__,__FUNCTION__,name_file);
    	exit(1);
        }
     
        /* definition of a table of char intended to receive the line */
        char line[500];
     
        /* read of the first line of file name_file */
        fgets (line, sizeof line, file);
     
        printf("line = \n %s\n",line);
     
        char *p = strchr(line, '\n'); /* on cherche le caractere \n */
        if (p != NULL) /* s'il est trouve on l'elimine */
    	*p = 0;
     
        int j=1;
        while(fgets (line, sizeof line, file) != NULL)
        {
     
    	printf("j = %d\n",j);
    	++j;
     
    	p = strchr(line, '\n'); /* on cherche le caractère \n */
    	if (p != NULL) /* s'il est trouvé on l'elimine*/
    	    *p = 0;	
     
     
    	int i;
    	double volume,dvolume_dt,y,t,T;
    	fscanf(file,"%lf",&t); /* on recupere le temps */
    	V_Vp(t,e,&volume,&dvolume_dt);
     
    	printf("t = %f\n",t);
     
    	/* calcul de la masse molaire du melange M en g/mol */
    	double M=0.0;
    	for(i=0;i<length-2;++i)
    	{
    	    /* on recupere la fraction massique de l'espece */
    	    fscanf(file,"%lf",&y);
     
    	    M+=y/TabSpecies[i]->M;
    	    printf("i = %d\ty = %f\tM = %f\n",i,y,M);
    	}
     
         //ici j'ai mon segmentation fault donc toto ne s'affiche pas a l'ecran
     
        printf("toto\n");
     
    	M=1.0/M;
     
    	printf("tata\n");
    	fscanf(file,"%lf",&T); /* on recupere la temperature */
     
    	/* calcul de la pression en Pa (d'ou le coefficient 0.1) */
    	const double pression=m/volume*R/M*T*0.1;
     
    	/* on ecrit dans le fichier name_file_out la pression */
    	fprintf(file,"%g\n",pression);
     
        } /* fin du while */
     
        if (feof(file)) /* end of file was detected */
        {
    	fprintf(stderr,"Error in file %s line %d function %s \n:Exit program\n",__FILE__,__LINE__,__FUNCTION__);
    	exit(1);
        }
     
        if (ferror(file)) /* an error occurred */
    	fprintf(stderr,"Error in file %s line %d function %s : a misreading occurred\nExit program\n",__FILE__,__LINE__,__FUNCTION__);
     
        /* on ferme les fichiers */
        fclose(fileOutput);
        fclose(file);
     
        return;
    }
    l'erreur se trouve à la sortie de la boucle for(i=0;blabla). A la sortie j'ai un segmentation fault si bien que toto ne s'affiche pas à l'écran.

    1) Savez-vous pourquoi s'il vous plait ?
    2) j'ai écrit un moment char line[500]. Mais je ne connais pas la longueur de la ligne. J'espère que 500 caractères suffisent mais exite-t-il une autre manière pour être sûr d'avoir tous les caractères de la ligne ?
    3) la petite cerise sur le gâteau : j'aimerais bien rajouter la colonne de la pression à la suite des autres colonnes de mon fichier "sorties.dat" (histoire de n'avoir qu'un seul fichier de sortie et non deux). Comment faire ?
    Pour cette question, j'avoue ne pas m'y être encore penché. je pense que ce doit être une question d'option r ou r+ ou w ou w+ dans mon fopen.

    Merci d'avance.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    oups, excusez-moi, j'ai trouvé l'origine de mon segmentation fault : je faisais TabSpecies d'un indice qui n'existait pas (je sortais du tableau). Mais ceci étant corrigé, ma prgm tourne mais mon fichier pression.dat est vierge...
    A votre avis, à quoi cela peut-il être du ?

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    ma prgm tourne mais mon fichier pression.dat est vierge...
    A votre avis, à quoi cela peut-il être du ?
    Par contre, ne déclare pas des variables en plein milieu d'une fonction, cela fait brouillon et cela rend la lecture plus difficile (enfin c'est mon avis)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     /* on ecrit dans le fichier name_file_out la pression */
       fprintf(file,"%g\n",pression);
    devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     /* on ecrit dans le fichier name_file_out la pression */
       fprintf(fileOutput,"%g\n",pression);
    2) j'ai écrit un moment char line[500]. Mais je ne connais pas la longueur de la ligne.
    J'espère que 500 caractères suffisent mais exite-t-il une autre manière pour être sûr d'avoir tous les caractères de la ligne ?
    Non, la seule solution c'est de vérifier que tu as recu un '\n", si ce n'est pas le cas, réitérer avec une boucle...

    3) la petite cerise sur le gâteau : j'aimerais bien rajouter la colonne de la pression à la suite des autres colonnes de mon fichier "sorties.dat" (histoire de n'avoir qu'un seul fichier de sortie et non deux). Comment faire ?
    Tu ne peux pas ou alors très "difficilement"... Voici d'autres pistes:
    - Garder tout en mémoire et écrire à la fin toutes tes informations (la plus simple des solutions mais par contre cela dépend de la quantité de données à gérer...)
    - Ecrire en deux fichiers et apres ouvrir les deux et écrire un troisieme fichier comme tu veux... Apres tu effaces les deux premiers...

    Jc

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Merci ! effectivement, je me suis bien planté entre file et fileOutput.

    Merci aussi de tes autres conseils. Je vais les appliquer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. envoyer un mail avec mon programme
    Par shrek dans le forum C++Builder
    Réponses: 8
    Dernier message: 06/12/2006, 12h27
  2. [Configuration] pb avec mon serveur sur intranet
    Par dehbi dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 30/07/2004, 16h39
  3. Réponses: 13
    Dernier message: 26/04/2004, 19h32
  4. Problème avec mon firewall ...
    Par Wis dans le forum Tomcat et TomEE
    Réponses: 15
    Dernier message: 06/04/2004, 08h46

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