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 :

Blocage lors de l'écriture dans un fichier [Non suivi]


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Points : 38
    Points
    38
    Par défaut Blocage lors de l'écriture dans un fichier
    Bonjour,
    je suis débutant en C, et j'ai un programme qui lit de gros fichiers de données numériques, les traite et calcule des statistiques.
    En gros il y a une lecture par groupe de 3 lignes ; fgets, puis sscanf , puis calcul d'un paramètre à partir de ces données qui sont stockées dans un tableau.
    On crée donc un nouveau fichier avec toutes les valeurs de ce paramètre (calculé en divers points géographiques).
    Tout fonctionne bien, mais au bout d'un moment l'écriture se bloque et il ne se passe plus rien ; exemple il écrit "0.5e+06" puis bloque sur "0.0e" ; est-ce un problème de buffer?
    un problème dans le calcul du paramètre? (je ne pense pas, au pire il met "nan" ou "inf" non?)
    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par yoyostras
    Tout fonctionne bien, mais au bout d'un moment l'écriture se bloque et il ne se passe plus rien ; exemple il écrit "0.5e+06" puis bloque sur "0.0e" ; est-ce un problème de buffer?
    un problème dans le calcul du paramètre? (je ne pense pas, au pire il met "nan" ou "inf" non?)
    Montre ton code, on est pas devins.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Points : 38
    Points
    38
    Par défaut
    je ne l'ai pas sous la main...
    j'imagine que vous n'êtes pas devins, mais comme je suis débutant, peut-être qu'il y a des erreurs classiques qu'on peut faire en c, notamment en lecture-écriture de données, gestion de buffer...

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    aucun moyen pour nous de savoir.....

    Les bouquins et cours disent ce qu'il faut faire...

    Pour un cas d'implémentation particulière et un bug, il faut le code....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Mia,
    Citation Envoyé par yoyostras
    je ne l'ai pas sous la main...
    j'imagine que vous n'êtes pas devins, mais comme je suis débutant, peut-être qu'il y a des erreurs classiques qu'on peut faire en c, notamment en lecture-écriture de données, gestion de buffer...
    Probablement, mais ça ne nous rend pas devins pour autant.
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 44
    Points : 38
    Points
    38
    Par défaut
    le voilà

    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
    for(i=0;i<NB_LAT;i++)
    {
     for(j=0;j<NB_LON;j++)
     {
    	// Pour chaque couple (lat,lon) : lecture de chaque groupe de lignes correspondant
    	fgets(buffer,LONG_MAX_LIGNE,fp); 
    	sscanf(buffer,"%f %f",&lat,&lon);
     
    	// Nombre d'obs et nombre de classes
    	fgets(buffer,LONG_MAX_LIGNE,fp);
    	sscanf(buffer,"%d %d",&nb_obs,&nb_clas);
     
    	// lecture des valeurs au centre de classe et remplissage de Tab_val[k][1] (k=classe)//
    	fgets(buffer,LONG_MAX_LIGNE,fp);
    	long_buf=strlen(buffer);
    	long_art=long_buf/nb_clas;
    	for(k=0;k<nb_clas;k++)
    	{
    		sscanf(buffer+(k*long_art),"%s",chaine_lue);
    		valeur_centre_classe=atof(chaine_lue);
    		Tab_val[k][1]=valeur_centre_classe;
    		Tab_val[k][3]=0.;
    	} 
     
    	// lecture des effectifs par classe et remplissage de Tab_val[k][2] (k=classe)//
    	fgets(buffer,LONG_MAX_LIGNE,fp);
    	long_buf=strlen(buffer);
    	long_art=long_buf/nb_clas;
    	for(k=0;k<nb_clas;k++)
    	{
    		sscanf(buffer+(k*long_art),"%s",chaine_lue);
    		valeur_pourcentage=atof(chaine_lue);
    		Tab_val[k][2]=valeur_pourcentage;
    	} 
     
    	pourcentage_cumule=0.;
    	for(k=0;k<nb_clas;k++)
    	{
    		pourcentage_cumule+=Tab_val[k][2];
    		Tab_val[k][3]=pourcentage_cumule;
    	} 
     
    	// Calcul du percentile pour le point de grille //
      	k=0;
    	percentile=0.;
    	printf("Calcul du percentile\n");
    	while((seuil>Tab_val[k][3])&&(k++<nb_clas-1)); // Faire k++ tant que tab_val<seuil et nb_classes non atteint //
    	if (k>0) percentile=Tab_val[k-1][1]+(Tab_val[k][1]-Tab_val[k-1][1])*((seuil-Tab_val[k-1][3])/(Tab_val[k][3]-Tab_val[k-1][3]));
    	fprintf(fp_out," %.4e",percentile);
    le blocage se fait sur la dernière ligne que j'ai écrite

    [-mod- Merci de lire les regles du forum et de placer les balises de code. Fait.]

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par yoyostras
    le voilà
    <...>
    le blocage se fait sur la dernière ligne que j'ai écrite
    Ce code ne compile pas. Il ne peut pas être testé.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    En dehors du fait qu'il n'y a aucune vérification sur le fait que fgets peut échouer, plusieurs choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	long_art=long_buf/nb_clas;
    	for(k=0;k<nb_clas;k++)
    	{
    		sscanf(buffer+(k*long_art),"%s",chaine_lue);
    ça ça me semble déjà hautement dangereux.... Calculer le nbe comme étant longueur/nb_clas.... pour en faire un sscanf...

    Il me semblerait nettement plus logique de chercher les séparateurs dans la chaine....

    Ensuite, dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	while((seuil>Tab_val[k][3])&&(k++<nb_clas-1)); // Faire k++ tant que tab_val<seuil et nb_classes non atteint //
    Le C permet les écritures compactes, mais pour un programme tel que le tien ce serait mieux si c'était plus clair :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	while((seuil>Tab_val[k][3])&&(k<(nb_clas-1)))
                    k = k + 1 ;
    Enfin les tableaux en C commencent à 0 et non pas à 1. Es-tu sûr de ce que tu fais ci-dessus ( l'indice 3 est le 4 ième élément.. Ton tableau est-il dimmensionné au moins à 4 ??), et ensuite ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	if (k>0) percentile=Tab_val[k-1][1]+(Tab_val[k][1]-Tab_val[k-1][1])*((seuil-Tab_val[k-1][3])/(Tab_val[k][3]-Tab_val[k-1][3]));
    ??

    Est-ce bien le 2ième élément pour Tab_val[k][1] ?? etc...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. OutOfMemory lors de l'écriture dans un fichier
    Par Mischka dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 13/11/2007, 13h06
  2. Problème lors de l'écriture dans un fichier.
    Par captainflex dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 16/05/2007, 13h42
  3. Réponses: 8
    Dernier message: 13/11/2006, 11h19
  4. Erreur E/S 32 lors de l'écriture dans un fichier text.
    Par yosthegost dans le forum Delphi
    Réponses: 6
    Dernier message: 01/06/2006, 11h45
  5. Passer à la ligne lors de l'écriture dans un fichier
    Par hams dans le forum Assembleur
    Réponses: 4
    Dernier message: 17/04/2005, 19h25

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