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 :

la façon la plus rapide pour lire un ficher en c++


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut la façon la plus rapide pour lire un ficher en c++
    Bonjour, je cherche la meilleur façon(la plus rapide) pour lire le contenu d'un fichier en c++.
    J'ai trouvé quelque méthode mais elle retourne le nombre de ligne, comment faire pour quelle retourne vector<string> svp!
    a votre avis qu'elle est la meilleure méthode?

    méthode (gnu wc):
    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
     
    static uintmax_t wc(char const *fname)
    {
        static const auto BUFFER_SIZE = 16*1024;
        int fd = open(fname, O_RDONLY);
        if(fd == -1) handle_error("open");
        /* Advise the kernel of our access pattern.  */
        posix_fadvise(fd, 0, 0, 1);  // FDADVICE_SEQUENTIAL
     
        char buf[BUFFER_SIZE + 1];
        uintmax_t lines = 0;//maximum width unsigned integer type
     
        while(size_t bytes_read = read(fd, buf, BUFFER_SIZE))
        {
            if(bytes_read == (size_t)-1)
                handle_error("read failed");
            if (!bytes_read)
                break;
     
            for(char *p = buf; (p = (char*) memchr(p, '\n', (buf + bytes_read) - p)); ++p)
                //memchr Converts ch to unsigned char and locates the first occurrence of that value in the initial count characters (each interpreted as unsigned char) of the object pointed to by ptr.
                ++lines;
        }
     
        return lines;
    }
    méthode(BOOST mapped_file):
    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
     
    #include <boost/iostreams/device/mapped_file.hpp> // for mmap
    #include <algorithm>  // for std::find
    #include <iostream>   // for std::cout
    #include <cstring>
     
    int main()
    {
        boost::iostreams::mapped_file mmap("5.txt", boost::iostreams::mapped_file::readonly);
        auto f = mmap.const_data();
        auto l = f + mmap.size();
     
        uintmax_t m_numLines = 0;
        while (f && f!=l)
            if ((f = static_cast<const char*>(memchr(f, '\n', l-f))))
                m_numLines++, f++;
     
        std::cout << "m_numLines = " << m_numLines << "\n";
    }
    méthode(mmap):
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include <algorithm>
    #include <iostream>
    #include <cstring>
     
    // for mmap:
    #include <sys/mman.h>
    #include <sys/stat.h>
    #include <fcntl.h>
     
    const char* map_file(const char* fname, size_t& length);
     
     
     
    void handle_error(const char* msg) {
        perror(msg);
        exit(255);
    }
     
    const char* map_file(const char* fname, size_t& length)
    {
        int fd = open(fname, O_RDONLY);
        if (fd == -1)
            handle_error("open");
     
        // obtain file size
        struct stat sb;
        if (fstat(fd, &sb) == -1)
            handle_error("fstat");
     
        length = sb.st_size;
     
        const char* addr = static_cast<const char*>(mmap(NULL, length, PROT_READ, MAP_PRIVATE, fd, 0u));
        if (addr == MAP_FAILED)
            handle_error("mmap");
     
        // TODO close fd at some point in time, call munmap(...)
        return addr;
    }
     
    int main()
    {
        size_t length;
        auto f = map_file("5.txt", length);
        auto l = f + length;
     
        uintmax_t m_numLines = 0;
        while (f && f!=l)
            if ((f = static_cast<const char*>(memchr(f, '\n', l-f))))
                m_numLines++, f++;
     
        std::cout << "m_numLines = " << m_numLines << "\n";
    }

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Tout ce qui a trait à l'IO disque va beaucoup dépendre de tes conditions locales : ta machine, le type de matériel, le contenu du fichier, l'OS, le système de fichier... Le meilleur moyen de trouver la méthode la plus rapide, c'est de toutes les essayer et de les comparer.
    Find me on github

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    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 189
    Points : 17 141
    Points
    17 141
    Par défaut
    pour retourner un vector de string, la ou tu vois un compteur++, a la place, tu inseres la ligne dans un vector.
    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
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    Quel est le rapport entre "lire le plus vite possible", "nombre de lignes" et "vector de ligne" ?

    Vu ton niveau qui semble faible, peut-être faudrait-il commencer par faire un code qui fonctionne avant de le vouloir rapide ou quoi que ce soit.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Y-a-t-il plus rapide pour enlever les accents ?
    Par Bruno13 dans le forum Langage
    Réponses: 48
    Dernier message: 12/05/2023, 11h24
  2. [XHTML] Moyen plus rapide pour mettre mes pages en XHTML
    Par Linoa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 30/08/2005, 17h46
  3. Réponses: 18
    Dernier message: 09/08/2005, 12h57
  4. Algo le plus rapide pour trouver une répétition ?
    Par AsmCode dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 28/07/2005, 00h26
  5. Réponses: 16
    Dernier message: 19/05/2005, 16h20

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