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

Bibliothèque standard C Discussion :

fopen ne retourne jamais


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Ardeciel
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut fopen ne retourne jamais
    bonjour !

    Voilà le but de mon appli :
    l'histoire se passe en TCP...
    c'est un client qui se connecte auprès d'un serveur et qui lui demande de lui envoyer un fichier.
    le client reçoit donc paquets par parquets le fichier en question et le stock ainsi que certaines caractéristiques dans une strucuture. Ceci fait, il veut le reconstituer dans le répertoire courant à coup de fwrite.
    voici le code de cette dernière partie :

    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
     
    struct stFichier
    {       char * cstNomFichier;
            int iTailleTotale;
            int * iPaquets;
            char ** tabPaquets;
    };
     
    int reconstFichier(struct stFichier stFich)
    {
            printf("dans reconst fichier\n");
            printf("nom = %s\n",stFich.cstNomFichier);
            printf("taille =%d\n",stFich.iTailleTotale);
            int ok = 1;
            printf("avant fopen\n");
            FILE * ptrFichier = fopen(stFich.cstNomFichier,"w+");
            printf("après fopen\n");
            if(ptrFichier == NULL)
            {   
                    perror("erreur ouverture lors de la reconstitution ->");
                    return -1; 
            }   
            int i=0;
            printf("avant while\n");
            while((stFich.iPaquets[i]>0)&&(i<stFich.iTailleTotale))
            {   
                    printf("reconst fichier -> %s\n",stFich.tabPaquets[i]);
                    fwrite(stFich.tabPaquets[i],sizeof(char),strlen(stFich.tabPaquets[i]),ptrFichier);
                    i++;
            }   
            printf("après while\n");
            fclose(ptrFichier);
            ptrFichier = NULL;
     
            ajoutFichier(stFich);
     
            return ok; 
    }
    j'ai l'affichage "avant fopen", mais pas le suivant "après fopen". le programme restant bloqué indéfiniment à la manière d'une boucle infinie. Je ne comprend pas ce qu'il se passe.
    les affichages précédent du nom et de la taille du fichier sont correctes.

    Pourriez vous m'aider ?

    Ardeciel

  2. #2
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Salut,
    la gestion de la structure est ok, j'ai testé
    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
    #include <stdio.h>
     
    struct stFichier
    {
    	char * cstNomFichier;
    	int iTailleTotale;
    	int * iPaquets;	char ** tabPaquets;
    };
     
    void test(struct stFichier a)
    {
      printf("%d\n", a.iTailleTotale);
      printf("%s\n", a.cstNomFichier);
     
      FILE *pF = fopen(a.cstNomFichier,"w+");
      fwrite("ok\n",3,1,pF);
      fprintf(pF,"%d",a.iTailleTotale);
      fclose(pF);
    }
     
    int main()
    {
      struct stFichier t;
      t.iTailleTotale = 220;
      t.cstNomFichier = strdup("test.txt");
      test(t);
     
      getchar();	
      return 0;
    }
    par contre

    int i=0;
    while((stFich.iPaquets[i]>0)&&(i<stFich.iTailleTotale))


    ne va pas puisque i est le compteur sur les paquets. Il sera très probablement TOUJOURS inférieur à la taille totale en octets du fichier. Donc continuera de boucler. Enlèves le && i<stFich.iTailleTotale

  3. #3
    Membre averti Avatar de Ardeciel
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 28
    Par défaut
    Bonjour !

    déjà, merci d'avoir passé du temps à tester mon code... ça me rassure de ne pas être la seule à penser que la structure est bonne.

    Pour la taille du fichier, je ne parle pas d'octet, mais de paquets de 512 octets. iTailletotale est le nombre de paquets de 512 présents dans le fichier.
    iPaquets est un tableau d'entier contenant la liste de ces paquets (un site peut ne pas détenir des paquets consécutifs ex : paquet num 3,7 et 42).
    en fait la condition :
    (stFich.iPaquets[i]>0) sert à ne manipuler que les paquets présents (j'initialise les cases vides à -1)

    et celle ci :
    (i<stFich.iTailleTotale) sert à être sur de ne pas dépasser les bornes du tableau iPaquets (vu que au delà, on ne sait pas ce qu'il y a dedans, ça peut être supérieur à 0)

    j'aurais du donner ces précisions dès le début, pardon.

    Le problème ne venais pas de là, vu que le while n'était jamais atteint.
    En fait, le processus executant cette fonction devenait zombie dès un appel system (comme fopen, perror...). Donc forcément, cet appel ne retournait jamais.
    cela venait d'un "seg fault" lancé bien avant dans mon code... -_-".

    merci encore pour le temps que tu as passé sur mon problème.
    bonne journée et joyeuses fêtes !

    Ardeciel

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

Discussions similaires

  1. UserDictionary ne retourne jamais rien
    Par linked dans le forum Android
    Réponses: 1
    Dernier message: 02/02/2012, 01h12
  2. SDL_OpenAudio ne retourne jamais
    Par dancingmad dans le forum SDL
    Réponses: 3
    Dernier message: 20/06/2010, 00h17
  3. fopen retourne error pour google link:
    Par speed034 dans le forum Langage
    Réponses: 2
    Dernier message: 01/06/2009, 02h19
  4. sem_wait() ne retourne jamais
    Par evilynux dans le forum POSIX
    Réponses: 7
    Dernier message: 28/08/2008, 09h59
  5. Réponses: 1
    Dernier message: 22/04/2008, 18h18

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