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 :

Gros fichiers tronqués par stdin


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut Gros fichiers tronqués par stdin
    Bonsoir,
    je m'arrache les cheveux depuis trois jours sur un problème assez bête : quand je lis un fichier sur l'entrée standard, dès qu'il dépasse le millier d'octets, il est tronqué.
    Je voudrais pouvoir utiliser les redirections avec mon programme, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_programme < gros_fichier.txt
    mais visiblement je ne m'y prends pas de la bonne manière.

    Voici un code simpliste avec lequel je peux reproduire le problème :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // affiche la taille d'un fichier
    #include<stdio.h>
    #define BUFFER_SIZE 1024
     
    char buffer[BUFFER_SIZE];
    int main() {
       int n;
       unsigned long long int i = 0;
       while (n = fread(buffer, sizeof(char), BUFFER_SIZE, stdin)) {
          i += n;
       }
       printf("%llu\n", i);
     
       return 0;
    }
    Pour les fichiers de moins de 1 Ko, ça m'affiche la bonne taille. Ça marche aussi avec un fichier un peu plus gros que mon buffer, 1197 octets. Mais pour les fichiers plus gros, j'obtiens des valeurs toujours inférieures à 1024.
    J'ai essayé aussi avec fgetc, même résultat. En revanche, pas de problème quand j'ouvre le fichier directement avec fopen, mais alors je ne peux pas utiliser les redirections…

    Si ça peut aider, je suis sous Windows. J'ai essayé sans succès sous cmd et Powershell – mais j'ai l'intuition que ça ne dépend pas du système. C'est agaçant, je suis sûr que je passe à côté d'un truc évident… J'ai besoin de votre aide !
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je vois déjà deux problèmes :

    - La valeur initiale de i doit être égale à 0 et non -1. Avec ton code actuel il manquera toujours au moins 1 octet à la taille affichée. En plus i est censé être non signé ...

    - stdin est toujours ouvert par défaut en mode texte, alors qu'un fichier doit être ouvert en mode binaire pour qu'on puisse obtenir correctement sa taille. En clair, ce code n'a aucune chance de fonctionner.

    A part ça, il faut utiliser %llu pour afficher un long long unsigned int et mettre return 0 si tu veux faire plus joli.

  3. #3
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Ok, je corrige pour la postérité. C'est un code censé reproduire le problème, autant qu'il le fasse correctement '^^

    Pour le -1 je me suis dit, peu importe qu'il soit unsigned ou pas puisque c'est représenté par quelque chose comme FFFFFFFF, et dans tous les cas, si on rajoute 1 ça fait 0.
    Et pourquoi -1 ? Je l'avais mis pour tester fgetc, j'ai juste oublié de le remettre à 0…

    Mais avec tout ça, on parle de la forme et pas du fond
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ce code fonctionne correctement sous linux, donc je pense que Melem est dans le vrai quand il parle de lire en mode binaire.

    Tu pourrais commencer par tester feof() pour voir si effectivement tu es à la fin du fichier, ou si tu es sorti en erreur.

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Mais avec tout ça, on parle de la forme et pas du fond
    On parle bien du fond parce que i doit être initialisé à 0 pour espérer avoir un résultat correct et parce que je te dis qu'il faut ouvrir le fichier en mode binaire donc tu dois utiliser fopen, autrement ça ne marchera jamais.

  6. #6
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Est-ce que ça signifie que le C ne permet pas, sous Windows, de traiter des gros fichiers en utilisant les redirections ?

    Pour situer un peu plus les choses, j'aimerais pouvoir utiliser mon programme dans une chaîne avec le pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prog1 | prog2 | prog3 | etc.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    La taille du fichier n'a rien à voir. Le problème c'est que stdin est toujours ouvert par défaut en mode texte, ce qui ne permet pas de calculer correctement la taille d'un fichier (3ème fois que je le répète ). Sous Unix, il n'y a pas de différence entre un fichier texte et binaire mais sous les autres systèmes, cette distinction existe la plupart du temps.

    Pour situer un peu plus les choses, j'aimerais pouvoir utiliser mon programme dans une chaîne avec le pipe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prog1 | prog2 | prog3 | etc.
    Alors fais get_file_size input.txt | prog2 | prog3 | etc. au lieu de get_file_size < input.txt, comme ça tu pourras utiliser fopen ...

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

Discussions similaires

  1. [SP-2007] Upload de gros fichiers par programme
    Par bigboomshakala dans le forum SharePoint
    Réponses: 10
    Dernier message: 31/03/2010, 09h55
  2. buffer "par morceau" pour gros fichiers binaires
    Par Benoit_T dans le forum Langage
    Réponses: 11
    Dernier message: 09/11/2009, 10h58
  3. Solution pour transférer des gros fichiers par HTTP
    Par manu_71 dans le forum Général Conception Web
    Réponses: 3
    Dernier message: 29/07/2009, 12h02
  4. Réponses: 5
    Dernier message: 23/07/2009, 19h49
  5. Upload par FTP avec des gros fichiers
    Par __fabrice dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 07/06/2006, 12h08

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