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 :

Fread et '\0'


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Etudiant en DUT Réseaux & Télécoms
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Réunion

    Informations professionnelles :
    Activité : Etudiant en DUT Réseaux & Télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut Fread et '\0'
    Bonjour,

    Je crée ce sujet parce que je suis confronté à un bug que je ne vois pas du tout comment résoudre, mais je pense savoir ce que c'est et d'où il provient.

    J'essaie d'échanger des données binaires (contenues dans des fichiers) avec des sockets UDP. J'utilise donc la fonction fread et j'effectue l'envoi avec sendto à la socket réceptrice ensuite.

    Le problème se fait lors de la lecture avec fread. Fread fonctionne et me renvoie bien le nombre de données que je lui demande de lire, mais la variable dans laquelle je veux stocker ces données lues effectue un formatage pour le moins étrange et s'arrête dès qu'il a un '\0. Dit comme ça, ça paraît très logique, le problème est que c'est la première fois que cela m'arrive.

    Je vous donne le 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
     
        FILE* file = NULL;
        file = fopen(namefile, "rb");
     
       char data[1454];
       int length = 1;
     
        if (file != NULL)
        {
            printf("File exists, sending file...\n");
        	while(feof(file) == 0){
     
                length = fread(data, 1, PACKETSIZE-6, file);
     
                printf("Retour de fread : %d\n", length);                       // Affiche 1454 soit la taille de PACKETSIZE-6
                printf("data size : %lu\n", strlen(data));                        // Affiche 250 et quelques, le 251ème caractère étant un '\0'
    Fread récupère donc bien 1454 caractères, mais mon buffer data n'en récupère pas la totalité. J'ai déjà adopté cette méthode, et ça avait fonctionné. Là je ne comprends vraiment pas. J'ai surement du manquer quelque chose.

    Merci d'avance pour votre aide

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est strlen() qui s'arrête au \0, pas fread().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Homme Profil pro
    Etudiant en DUT Réseaux & Télécoms
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Réunion

    Informations professionnelles :
    Activité : Etudiant en DUT Réseaux & Télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut
    Effectivement, je n'ai pas choisi le meilleur exemple pour mon printf.

    Pour autant, cela n'explique pas pourquoi data s'arrête au premier \0 lorsque j'affiche son contenu.

  4. #4
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    C'est le même problème avec printf... le \0 signifie qu'on est en fin de chaine.
    Je suppose qu'on doit pouvoir forcer la longueur de la chaine avec un truc genre %32s à la place de %s si la longeur est de 32 par example.
    Ca doit se trouver dans la doc de printf. Ou alors tu peux imprimer caractère par caractère avec une boucle for mais c'est très moche

    edit: non c'est pas ça... tu dois utiliser write() avec le descripteur numéro 1 (pour standard output)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(1, txt, 8); // où txt est la chaine et 8 sa longueur ;)

  5. #5
    Membre averti
    Homme Profil pro
    Etudiant en DUT Réseaux & Télécoms
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Réunion

    Informations professionnelles :
    Activité : Etudiant en DUT Réseaux & Télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut
    Merci pour vos réponses au fait

    Le problème avec ta solution SkyZoThreaD, c'est que je ne cherche pas tellement à afficher les données lues, mais à les envoyer à une socket lié à un descripteur (j'ai pas mis la suite du code, elle ne sert à rien tant que le début n'est pas réglé).

    Pour précision, à l'envoi (avec un sendto), data contient les 250 premiers caractères corrects puis est complété avec 1200 \0 (car je renseigne la taille que fread renvoie) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sendto(desc2, packet, length+6, 0, (struct sockaddr *) client, sizeclient);
    L'une des pistes dans mes recherches a été le type de data, mais j'ai tout essayé : tableau de charactère, pointeur sur une chaine... rien n'y fait

  6. #6
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Ah ok! faut être précis :
    lorsque j'affiche son contenu.
    Effectivement c'est pas bon pour un sendto mais du coup ça devrait pas poser de problème de \0 puisque la taille est controllée.
    Pour le type de données, le char* convient très bien ou tout simplement void*.
    Maintenant, sans le reste, je ne vois pas d'où ça peut venir...

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par SkyZoThreaD Voir le message
    tu dois utiliser write() avec le descripteur numéro 1 (pour standard output)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(1, txt, 8); // où txt est la chaine et 8 sa longueur ;)
    1? Pourquoi ce nombre magique? Le descripteur de la sortie standard, c'est STDOUT_FILENO, comme son nom l'indique!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Par ce que la doc que j'ai donnait la valeur en direct
    Merci pour la précision

Discussions similaires

  1. prblme de lecture avec fread ... etrange...
    Par toto4650 dans le forum MFC
    Réponses: 14
    Dernier message: 28/07/2005, 17h58
  2. problème de fread
    Par _ky_ dans le forum C
    Réponses: 6
    Dernier message: 10/09/2004, 14h45
  3. fread et mem
    Par drKzs dans le forum C
    Réponses: 9
    Dernier message: 29/09/2003, 16h17
  4. [fread] Problème de lecture de buffer
    Par karl3i dans le forum C
    Réponses: 2
    Dernier message: 25/09/2003, 09h21
  5. fwrite et fread
    Par bohemianvirtual dans le forum C
    Réponses: 5
    Dernier message: 05/06/2002, 12h24

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