Использование C ++ для определения количества строк в текстовом файле - PullRequest
1 голос
/ 10 мая 2010

Моя программа на C ++ должна знать, сколько строк в определенном текстовом файле. Я мог бы сделать это с помощью getline () и цикла while, но есть ли лучший способ?

Ответы [ 6 ]

4 голосов
/ 10 мая 2010

Нет.

Нет, если только файловая система вашей операционной системы не отслеживает количество строк, а ваша система почти наверняка этого не делает, поскольку это было долгое время с тех пор, как я это видел.

2 голосов
/ 10 мая 2010

Под «другим способом» вы подразумеваете более быстрый путь? Независимо от того, что вам нужно прочитать все содержимое файла. Чтение в чанках разного размера не должно иметь большого значения, так как ОС или базовые файловые библиотеки (или обе) буферизуют содержимое файла.

getline может быть проблематично, если в очень большом файле всего несколько строк (интенсивное использование переходной памяти), поэтому вам может потребоваться прочитать фрагменты фиксированного размера по 4 КБ и обработать их по одному.

1 голос
/ 10 мая 2010

Самый быстрый, но зависящий от ОС способ состоит в том, чтобы отобразить весь файл в память (если невозможно отобразить весь файл сразу - последовательно отобразить его в виде фрагментов) и вызвать std::count(mem_map_begin,mem_map_end,'\n')

1 голос
/ 10 мая 2010

Повторяйте файл char-by-char с помощью get (), и для каждой новой строки (\n) увеличивайте номер строки на единицу.

0 голосов
/ 10 мая 2010

возможно, самый быстрый способ - использовать низкоуровневое чтение () и буфер сканирования для '\ n':

int clines(const char* fname)
{
    int nfd, nLen;
    int count = 0;
    char buf[BUFSIZ+1];

    if((nfd = open(fname, O_RDONLY)) < 0) {
        return -1;
    }

    while( (nLen = read(nfd, buf, BUFSIZ)) > 0 )
    {
        char *p = buf;
        int n = nLen;
        while( n && (p = memchr(p,'\n', n)) ) {
            p++;
            n = nLen - (p - buf);
            count++;
        }
    }
    close(nfd);
    return count;
}
0 голосов
/ 10 мая 2010

Не знаю, является ли getline() лучшим - размер буфера является переменной в худшем случае (последовательность \ n), он может читать байт за байтом в каждой итерации.

Для меня было бы лучше прочитать файл кусками заданного размера. И чем сканировать количество новых кодировок строки (внутри. Хотя есть некоторый риск, который я не могу / не знаю, как решить: другие кодировки файлов, чем ASCII. Если getline() справится, то это проще всего, но я не думаю, что это правда.

Некоторые URL:

Почему широкий файловый поток в C ++ сужает записанные данные по умолчанию?

http://en.wikipedia.org/wiki/Newline

...