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 :

Fichiers vers tableau d'entiers en C


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 77
    Points : 46
    Points
    46
    Par défaut Fichiers vers tableau d'entiers en C
    Bonjour,

    J'ai actuellement un fichier avec plein d'entiers dedans. Chaque entiers sont séparés par des espaces, et je ne connais pas le nombre d'entiers présents dans le fichier.
    Je pourrais m'en sortir en placant le contenu du fichier dans un buffer, et faire un strtok() dessus afin de séparer tous les espaces, et ensuite stocker tous les entiers dans un tableau.
    Mais ce que je recherche est la manière la plus rapide qu'il soit, car je traite de gros fichiers.
    J'ai vu qu'il y avait les mmap, mais je sais pas si cela pourrait résoudre mon problème.

    Merci par avance pour votre aide.

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Il n'y a pas trente-six solutions, celle que tu proposes me paraît raisonnable. Tu peux adapter l'implémentation en fonction de la manière dont sont formatées les entrées et de la confiance que tu y accordes (strtok, strchr, strspn, strcspn..).

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    mmap ne résoudra pas magiquement ton problème, car ton fichier contient la forme textuelle de tes nombres, pas leur forme binaire.

    Tu n'échapperas pas à la conversion const char* vers int, c'est à dire une des ?scanf().
    Quant au problème du nombre d'entiers à lire, tu as trois solutions:
    1. Avoir au début du fichier cette information. De nombreux formats procèdent ainsi (paquets IP, header HTTP, format 3D "obj", format bmp, etc)
    2. Utiliser une structure plus souple qu'un tableau de taille fixe: une liste (ou une liste de petits tableaux, parfois, c'est bien aussi)
    3. Lire le fichier une première fois pour les compter, puis une seconde en sachant combien il y en a.

    Le premier choix est le plus "agréable", mais n'est pas toujours possible.
    Le dernier est le plus mauvais, car très lent quand les fichiers sont longs.

    Tes entiers sont ils indépendants, ou groupés par petits paquets ayant une signification?
    Dans le second cas, je t'invite très vivement à définir une structure pour matérialiser cette sémantique. Et faire une liste de cette structure
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par ternel Voir le message
    Tu n'échapperas pas à la conversion const char* vers int, c'est à dire une des ?scanf().
    Ou un membre de la famille de strtol. Ça fait un bon moment que je n'ai pas touché à *scanf en « production » perso. Non que ces fonctions ne fassent pas le job, mais les contraintes inhérentes à leur utilisation limitent leur pertinence dans de nombreux cas.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Mon C commence à rouiller… J'ai souvenir qu'il y a un gros défaut avec certaines de ces fonctions (une erreur de formattage renvoie 0, qui n'est pas une valeur aberrante)
    A méditer, puis retourner lire la FAQ sur les bonnes manières
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    En fait tu peux déterminer s'il y a eu erreur de conversion si les conditions suivantes sont réunies :

    • la valeur de retour est zéro ;
    • errno != ERANGE ;
    • end - s != strlen(s), avec s et end les pointeurs passés en premier et second arguments respectivement.


    C'est un peu lourd je te l'accorde mais ça permet une gestion robuste de la conversion.


    J'ai édité mon message précédent qui mentionnait les fonctions de conversion vers des nombres à virgule flottante (strtod) et non celles vers des entiers : strtol.

  7. #7
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Citation Envoyé par Syarko Voir le message
    Bonjour,

    J'ai actuellement un fichier avec plein d'entiers dedans. Chaque entiers sont séparés par des espaces, et je ne connais pas le nombre d'entiers présents dans le fichier.
    Je pourrais m'en sortir en placant le contenu du fichier dans un buffer, et faire un strtok() dessus afin de séparer tous les espaces, et ensuite stocker tous les entiers dans un tableau.
    Mais ce que je recherche est la manière la plus rapide qu'il soit, car je traite de gros fichiers.
    Bonjour,
    gros comment ? quel est l'ordre de grandeur du nombre d'entiers à lire ? quel est l'ordre de grandeur des entiers ? Combien de fois sera-tu amené à faire cette opération ?

    Ça se sont les questions qui vont t'indiquer quelles techniques employer pour avoir une version fonctionnelle. Ensuite seulement tu pourras peut-être, si le besoin s'en fait réellement ressentir, commencer à penser à l'optimisation. Et pour ce faire tu auras à ta disposition des outils qui t'indiqueront où il est rentable d'essayer d'optimiser.

    Citation Envoyé par Syarko Voir le message
    J'ai vu qu'il y avait les mmap, mais je sais pas si cela pourrait résoudre mon problème.

    Merci par avance pour votre aide.
    mmap n'est pas portable ; si ce n'est pas un souci pour toi cela pourrait être une option, tout comme implémenter par toi même la lecture d'entier dans un buffer. Tout va dépendre des réponses aux premières questions ainsi qu'à l'utilisation de ton programme.

Discussions similaires

  1. [XL-2003] Données dans fichier .txt vers tableau en .xls
    Par Invité1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/08/2009, 20h30
  2. JAI : PlanarImage vers tableau d'entiers
    Par Methode dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 14/05/2008, 17h53
  3. Charger un fichier dans tableau d'entier
    Par nico0007 dans le forum Langage
    Réponses: 12
    Dernier message: 17/04/2008, 12h30
  4. Lecture fichier txt vers tableau alloué
    Par yeboum dans le forum Fortran
    Réponses: 3
    Dernier message: 27/11/2007, 10h31
  5. [WD9] Fichier HF vers tableau mémoire
    Par Romanops dans le forum WinDev
    Réponses: 8
    Dernier message: 08/06/2006, 13h10

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