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";
}