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 :

Augmenter la taille d'un buffer


Sujet :

C

  1. #21
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 805
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Jamais
    J'ai pigé mais ce n'est pas facile

    Il y a un while pour que la taille de l'allocation dépasse la taille de lecture (dans le cas SZ_READ > SZ_ALLOC)
    Sinon dans le cas SZ_READ < SZ_ALLOC, une seule allocation est nécessaire.


    Citation Envoyé par Sve@r Voir le message
    feof() ne sert pas à ça. feof() ne détecte pas une fin de fichier, il détecte si, une fois que tu ne peux plus lire le fichier (donc comme le dis Matt_Houston, une fois que tu as tenté de lire un octet de plus que ce qu'il y en a dans le fichier), à indiquer si la cause de la "non-lecture" est due à une fin (tentative de lire un de plus) ou à autre chose (panne disque, etc...)

    Avec ton test, tu fais ton traitement une fois de trop...
    En plus simple : il ne faut rien entre le fread et le feof (<- dans ce sens).
    Ce qui est logique: pour ton exemple, tu affiches d'abord et après tu te demandes "Et si j'arrive à la fin"

    Dans mon cas, et si le fichier est vide ? faire un premier feof permet de le détecter ?

    Après, c'est toujours la même question en informatique: est-ce qu'il faut faire telle chose même si cela n'arrive quasi jamais (je peux transformer mon while en do ... while)


    Citation Envoyé par Sve@r Voir le message
    Si on veut que ça fonctionne il faut tester le fgets() (ou la fonction de lecture utilisée). Et donc le feof() ne sert plus...
    Sauf que moi je veux lire "n" octets par "n" octets ... et non pas ligne par ligne.


    Citation Envoyé par Sve@r Voir le message
    Sinon pour ta méthode d'allocation oui ça fonctionne puisque tu lis "n" et tu alloues "n". Avec un risque de réallocation "en rafales" si n vaut 1.
    Avec des fichiers chiffrés en AES, la taille est fixée Donc 1 allocation

    Sinon, je ne me prends pas la tête : n doit être grand

  2. #22
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Citation Envoyé par foetus Voir le message
    Dans mon cas, et si le fichier est vide ? faire un premier feof permet de le détecter ?
    Justement, non. feof renverra toujours zéro sur un flux nouvellement ouvert. Je le répète : tant que tu n'as pas essayé de lire le flux, tu ne peux pas déterminer s'il reste des données disponibles.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    En gros, ton test doit être comme ça:
    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
    nRead = fread(...);
    if(nRead == ...)
    {
    	//succès!
    }
    else
    {
    	//fread() a échoué / n'a pas pu lire tout ce qu'on demandait /etc.
    	if(feof(...))
    	{
    		//C'est la fin normale du fichier
    	}
    	else
    	{
    		//C'est une vraie erreur
    	}
    }
    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.

  4. #24
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 871
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    En plus simple : il ne faut rien entre le fread et le feof (<- dans ce sens).
    Moui. Effectivement on peux faire "lecture+if feof". Ca marche. MAIS comme la fonction de lecture donne elle-même l'indication "lecture réussie/echec" autant utiliser directement cette information pour quitter la boucle.

    Citation Envoyé par foetus Voir le message
    Ce qui est logique: pour ton exemple, tu affiches d'abord et après tu te demandes "Et si j'arrive à la fin"
    Ben je ne sais pas si tu as remarqué mais j'ai tapé cet exemple pour te montrer l'erreur du tien !!! Parce que c'est exactement ce que tu fais dans l'exemple où tu charges un fichier en mémoire...

    Citation Envoyé par foetus Voir le message
    Dans mon cas, et si le fichier est vide ? faire un premier feof permet de le détecter ?
    Ben t'as essayé ???

    Citation Envoyé par foetus Voir le message
    (je peux transformer mon while en do ... while)
    Non tu ne peux pas. Le souci ne vient pas du fait de savoir s'il vaut mieux une boucle 0...n ou bien une boucle 1...n (encore que je pense que la boucle 0...n est plus adaptée au cas "fichier vide") ; il vient du fait que dans ton exemple tu lis puis tu traites ce que tu as lu sans vérifier d'abord que tu avais réellement lu quelque chose; en te fiant au flag feof alors que ce flag n'est levé que quand 1) une lecture échoue et 2) quand l'échec est dû au fait que la lecture se fait au delà de ce qu'il y a réellement à lire (ces deux conditions devant être simultanées).

    Citation Envoyé par foetus Voir le message
    Sauf que moi je veux lire "n" octets par "n" octets ... et non pas ligne par ligne.
    C'est pareil. J'ai utilisé fgets() pour la visibilité du truc mais ça marche avec n'importe quelle fonction de lecture (fgetc, fread, fscanf, ...). C'est la fonction de lecture qui t'indique elle-même quand arrêter. D'ailleurs si tu réfléchis bien, c'est pareil dans la vraie vie. Quand tu veux compter des trucs, tu ne t'arrêtes de compter qu'à partir du moment où tu constates qu'il n'y a plus rien à compter. Donc quand tu as tenté de compter "plus" que ce qu'il y en a. C'est fait de façon inconsciente mais c'est quand-même comme ça que ça se passe...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. stringstream : augmenter la taille initiale du buffer
    Par jeanmarcL dans le forum SL & STL
    Réponses: 2
    Dernier message: 17/04/2007, 22h10
  2. comment augmenter la taille d'un tableau ?
    Par salseropom dans le forum C
    Réponses: 5
    Dernier message: 16/12/2005, 13h47
  3. augmenter la taille d'une tablespace?
    Par sali dans le forum Oracle
    Réponses: 1
    Dernier message: 01/12/2005, 16h52
  4. [Redo log] : augmenter la taille des fichiers
    Par user_oracle dans le forum Oracle
    Réponses: 3
    Dernier message: 29/11/2005, 20h49
  5. []Augmenter la taille de la pile des appels ?
    Par oncle ervil dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/05/2005, 10h29

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