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 :

A propos de fread..


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Par défaut A propos de fread..
    Bonjour,

    j'ouvre des fichiers en mode wb+ (donc logiquement en lecture/écriture binaire) mais j'ai un soucis : je commence par écrire, avec fwrite, puis je fais un fflush et un rewind (pour revenir au début du fichier), et enfin lis ce que je viens d'écrire avec fread.

    Le problème c'est que fread ne me lit rien (l'appel à perror(NULL) me renvoie : "Protocol error").
    Il faut que je ferme le fichier et le réouvre en mode rb pour que je puisse lire.

    J'ai bien ouvert le fichier en mode ab+, et ça marche, mais j'ai vraiment besoin d'utiliser wb+, car plus tard j'utiliserai la fonction tmpfile, qui ouvre les fichiers dans ce mode.

    Avez-vous une idée pour régler ce problème ?

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Un petit bout de code pour nous aider à t'aider, j'ai oublié ma boule de cristal au boulot

    Merci
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Par défaut
    Il n'y a rien de spécial dans le code, c'est pour ça que je ne l'ai pas mis.

    Déjà, est-ce que le fait de faire des fwrite puis des fread en mode wb+ marche chez quelqu'un ?

    Voici le magnifique bout de code, qui n'a rien de spécial (les fread et fwrite marchent, c'est sûr, mais pas en wb+) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ftmp[0] = fopen("tetmp3", "wb+");
     
    for (p=0 ; p < nl ; p++)
    	fwrite(rouge[p], np, 1, ftmp[0]);
     
    fflush(ftmp[0]);
    rewind(ftmp[0]);
     
    for (j=0 ; j < nl ; j++)
    	fread(rouge[j], np, 1, ftmp[0]);
     
    fclose(ftmp[0]);

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je ne vois rien de particulier dans ton code si ce n'est qu'il n'y a aucun contrôle sur les valeurs de retour.

    Il faut ajouter des tests après fopen(), fread(), fwrite(), fflush() et fclose(), cela permettra de diagnostiquer un éventuel problème ici.

    Au fait, quelle est la valeur de nl et np lorsque tu rentres dans ta fonction (par la même occasion, peut être qu'un nom plus parlant serait le bienvenue aussi).

    Le problème c'est que fread ne me lit rien (l'appel à perror(NULL) me renvoie : "Protocol error").
    fread lit quelque chose ou retourne une erreur. Après, peut être qu'il le range au mauvais endroit ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Par défaut
    C'est ici une version épurée du code, donc je n'ai pas fait apparaître tous les contrôles sur les valeurs de retour.

    fread ne lit rien (donc retourne 0), mais perror indique Protocol error
    Ca ne peut donc pas être rangé au mauvais endroit, puisqu'aucun octet n'est lu

    Quant aux noms des variables nl et np je suis du même avis que toi mais ce sont des variables pré-existantes

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Au fait, quelle est la valeur de nl et np lorsque tu rentres dans ta fonction
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Par défaut
    nl vaut 600 et np vaut 443

    Mais j'ai essayé avec nl = np = 10 et ça ne change rien, j'ai toujours des Protocol error

    Edit : j'ai regardé si le rewind marche correctement, et c'est le cas (j'appelle ftell() pour savoir où je suis dans le fichier)

    Edit 2 : ce que je trouve bizarre aussi, c'est que si je supprime le fflush et le rewind, fread se comporte exactement de la même façon

  8. #8
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    • d'une part rouge[j] ne devrait-il pas être une adresse dans le fread ?

    • d'autre part, le "w+" indique, si mes souvenirs sont bons, une écriture en mode append..

      Pas une lecture..

  9. #9
    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
    souviron34 :
    d'une part rouge[j] ne devrait-il pas être une adresse dans le fread ?
    ce doit être le cas, sinon il aurait déjà un problème avec le fwrite (à moins que les données écrites soient fausses, sans que le programme plante ouvertement ?).

    d'autre part, le "w+" indique, si mes souvenirs sont bons, une écriture en mode append..
    append est identifié par a
    w+ truncate to zero length or create text file for update

  10. #10
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par diogene Voir le message
    ce doit être le cas, sinon il aurait déjà un problème avec le fwrite
    je sais pas.. A voir l'écriture, j'ai comme un doute...



    Maintenant, pour le flag, c'est donc bien un flag d'écriture...

  11. #11
    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
    Citation Envoyé par souviron34 Voir le message
    je sais pas.. A voir l'écriture, j'ai comme un doute...
    Les arguments de fwrite et de fread sont du même type.
    Maintenant, pour le flag, c'est donc bien un flag d'écriture...
    Le mode update permet la lecture et l'écriture.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Par défaut
    rouge est un tableau à 2 dimensions donc no problem

    Et en plus je vous ais dis que ça marche avec le mode ab+, donc il faut bien chercher du côté de wb+ à mon avis

  13. #13
    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
    Et en rb+, ça marche ?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Par défaut
    oui, mais ça ne crée pas le fichier s'il n'existe pas

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Lorsque tu exécutes le programme avec le mode "wb+", le fichier est-il bien créer (penses à le supprimer avant l'exécution afin d'être certain) ? Est-il correctement rempli ?
    Sous quel environnement travailles-tu ?
    Peux-tu fournir un code minimal mais compilable permettant de reproduire ce problème ?

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Par défaut
    oui le fichier se crée bien et est bien rempli
    Je travaille sous Ubuntu.

    Voici un code simplifié qui compile, n'a aucune erreur chez moi, mais dont le fread ne marche pas avec wb+ mais qui marche avec ab+ :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
     
    int main(int argc, char **argv)
    {
    	int i;
    	int tab[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10}, tab2[10] = {0};
    	FILE *ftmp;
     
    	ftmp = fopen("tetmp1", "wb+");
    	if (!ftmp)
    		exit(-1);
     
    	switch (fork())
    	{
    		case -1:
    			puts("Erreur lors du fork\n");
    			exit(-1);
    		case 0:
    			printf("Fils de pid %d\n", getpid());
     
    			fwrite(tab, sizeof(int), 10, ftmp);
    			exit(0);
    		default:
    			break;
    	}
     
    	wait(NULL);
     
    	fflush(ftmp);
    	rewind(ftmp);
     
    	fread(tab2, sizeof(int), 10, ftmp);
     
    	for (i=0 ; i < 10 ; i++)
    		printf("T2 %d : %d\n", i, tab2[i]);
     
    	fclose(ftmp);
     
    	return 0;
    }

  17. #17
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Tu avais omis de préciser que tu travaillais avec deux processus différents, ce qui a sont importance.

    Pour simplifier à l'extrême, fork() crée un processus en dupliquant le contexte mémoire. De ce fait je doute fortement qu'un appel à fflush() dans le père ait un quelconque impact sur le buffer d'écriture du fils.

    Juste deux petits conseils en passant :
    • Dans de nombreux cas, ouvrir un fichier en lecture/écriture est une mauvaise idée. Lorsque l'on en arrive à le faire, il faut se poser un instant et bien peser toutes les conséquences.
    • Pour faire communiquer deux processus entre eux, j'aurais plus tendance à utiliser un pipe qu'un fichier classique.

  18. #18
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    disons que ça peut se faire avec 2 processus différents, mais comme tu le dis il faut bien faire attention..

    Et c'est nettement plus simple avec 2 processus vraiment différents qu'un père et son fils, qui partagent un certain nombre de variables...


    Un processus qui écrit (et qui a ouvert en w) et un qui lit (qui a ouvert en r)

    ça ça marche bien..

    Si les process sont vraiment différents, les pointeurs le sont aussi.

    Sinon, c'est la pagaille... L'un écrit et déplace le pointeur, l'autre fait rewind, l'autre veut réécrire et écrase...


    Disons que dans ton cas, le fopen serait mieux dans le case, avec un open différent suivant le père ou le fils..

  19. #19
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Un processus qui écrit (et qui a ouvert en w) et un qui lit (qui a ouvert en r)

    ça ça marche bien..
    Oui ça peut fonctionner si c'est correctement fait, mais est-ce vraiment adapté, sachant qu'il existe différents autres mécanismes qui font ça très bien et dont c'est le rôle (en tout cas davantage le rôle qu'un simple fichier) : pipe, socket, message queue, mailbox, etc. ?

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Par défaut
    Exact, désolé j'ai oublié cette info

    Pour les pipe, je ne peux pas les utiliser, car mon prof (c'est pour un TP) veut qu'on utilise le fork, et que le fils écrive dans un fichier, que le père lit après

    Après, étant donné que je devrai utiliser tmpfile, je ne peux pas fermer le fichier pour le rouvrir qu'en lecture, c'est pour ça que je simule le tmpfile avec le wb+ (pour le débugage donc).

    J'ai déplacé le fflush et le rewind dans le fils, ça devrait marcher normalement non ? si j'ai bien compris.
    Mais ça ne marche toujours pas

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
     
    int main(int argc, char **argv)
    {
    	int i;
    	int tab[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10}, tab2[10] = {0};
    	FILE *ftmp;
     
    	ftmp = fopen("tetmp1", "wb+");
    	if (!ftmp)
    		exit(-1);
     
    	switch (fork())
    	{
    		case -1:
    			puts("Erreur lors du fork\n");
    			exit(-1);
    		case 0:
    			printf("Fils de pid %d\n", getpid());
     
    			fwrite(tab, sizeof(int), 10, ftmp);
    			fflush(ftmp);
    			rewind(ftmp);
    			exit(0);
    		default:
    			break;
    	}
     
    	wait(NULL);
    	//fflush(ftmp);
    	//rewind(ftmp);	
     
    	fread(tab2, sizeof(int), 10, ftmp);
     
    	for (i=0 ; i < 10 ; i++)
    		printf("T2 %d : %d\n", i, tab2[i]);
     
    	fclose(ftmp);
     
    	return 0;
    }

Discussions similaires

  1. a propos de fwrite/fread
    Par Fifou625 dans le forum C
    Réponses: 10
    Dernier message: 28/02/2011, 00h58
  2. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22
  3. Fonctionnement de la compression DivX
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/09/2002, 14h10
  4. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/07/2002, 09h18
  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