Подсчёт количества строк в текстовом файле
Во многих редакторах при работе с текстовым документом вы можете видеть, сколько всего строк содержится в этом файле. Строки между собой разделяются символом перевода строки, который в каждой операционной системе (Windows, Unix, Mac) свой.
Давайте разберёмся, как быстро подсчитать количество строк в текстовом файле независимо от той ОС, в котором выполняется наш код. Более того, текстовый файл может быть сколь угодно большим, поэтому мы будем использовать буферизацию потока, чтобы не израсходовать всю доступную оперативную память.
Предположим, наш метод принимает на вход абсолютный путь до целевого файла, а возвращает количество строк в виде целочисленного типа long. Рассмотрим две реализации.
Вариант c LineNumberReader
public static long getLineCountByReader(String fileName) throws IOException <
try ( var lnr = new LineNumberReader( new BufferedReader( new FileReader(fileName)))) <
while (lnr.readLine() != null ) ;
return lnr.getLineNumber();
>
>
Сначала мы в конструкции try-with-resources последовательно создаём три Reader’a, оборачивая один в другой:
- FileReader – для работы с файлом.
- BufferedReader – для буферизации потока и ускорения обработки.
- LineNumberReader – собственно, для подсчёта количества строк.
Все перечисленные ридеры являются ресурсами и конструкция try-with-resources гарантирует нам, что после выхода из этого блока они все будут закрыты.
Затем в цикле вызываем у LineNumberReader метод readLine(). Поскольку никаких дополнительных действий нам делать не надо, то тело цикла будет пустым. После выхода из цикла метод getLineNumber() возвращает нам количество строк в файле.
На мой взгляд, это наиболее «читаемая» реализация, но ниже мы рассмотрим чуть более быструю версию. А пока можем вызвать наш метод:
public static void main(String[] args) throws IOException <
System.out.println( «Lines count: » + getLineCountByReader( «/home/user/very-large-file.txt» ));
>
Даже для текстового файла на десятки мегабайт подсчёт количества строк занимает меньше секунды.
Вариант c инкрементом
Наш метод можно немного ускорить, отказавшись от LineNumberReader. Вместо этого будем подсчитывать строки с помощью обычного инкремента.
public static long getLineCountByIncrement(String fileName) throws IOException <
var lines = 0L ;
try ( var reader = new BufferedReader( new FileReader(fileName))) <
while (reader.readLine() != null ) <
lines++;
>
return lines;
>
>
Здесь мы точно так же в блоке try создаём FileReader и BufferedReader, чтобы по окончании они были гарантированно закрыты. После этого в цикле на каждой итерации также вызываем метод readLine(). На этот раз тело цикла у нас не пустое, в нём мы увеличиваем переменную lines на 1. Такая реализация быстрее предыдущей примерно на 10%.
Как посчитать количество строк в файле c
Подскажите, пожалуйста, как можно посчитать количество строк в текстовом файле?
Вот как я делаю:
Код:
while (!feof(read)) // если не конец – едем дальше
fgets(s, 150,read);
count++; //считаю строку
>;
Но есть большое НО – функция fgets заканчивает считывать строку только когда в конце есть ‘\n’, а этот символ стоит далеко не всегда(например, Когда в любом текстовом редакторе набираешь текст, то он при автопереносе на новую строку символ ‘\n’ не ставит) а без него этот алгоритм бесполезен
Подскажите, как сделать правильно
Re: Как посчитать строки в файле?
| От: | Lucker | http://lucker.intervelopers.com/ |
| Дата: | 20.04.03 05:47 | |
| Оценка: |
Здравствуйте, Froland, Вы писали:
F>Но есть большое НО – функция fgets заканчивает считывать строку только когда в конце есть ‘\n’, а этот символ стоит далеко не всегда(например, Когда в любом текстовом редакторе набираешь текст, то он при автопереносе на новую строку символ ‘\n’ не ставит) а без него этот алгоритм бесполезен
Это НО совсем не большое. То что редактор переносит текст не влазящий в определенную длину строки на новую строку называется word-wrap и влияет это только на отображение строки в этом редакторе (практически везде можно отключить автоперенос строк (и тогда ты увидишь то что у тебя реально в файле) или же изменить количество символов, после которых у тебя осуществляется автоперенос).
Ищи алгоритм WORD-WRAPера
Re: Как посчитать строки в файле?
| От: | Kaa | http://blog.meta.ua/users/kaa/ |
| Дата: | 20.04.03 14:33 | |
| Оценка: |
Здравствуйте, Froland, Вы писали:
Вот один из способов подсчета количества строк:
#include #include #include int CountStrings( std::istream& is ) < if ( ! is.good() ) return 0; std::string s; int nStrings = 0; while ( std::getline( is, s ) ) ++nStrings; return nStrings; > int CountStrings( const char* name ) < std::fstream is; is.open( name, std::ios_base::in ); return is.good() ? CountStrings( is ) : 0; > int main( int argc, char* argv[] ) < using namespace std; for ( int i = 1; i < argc; ++i ) cout "Count of strings in " << argv[i] " equals " return 0; >
Алексей Кирдин
Re: Как посчитать строки в файле?
| От: | Юнусов Булат | |
| Дата: | 20.04.03 15:50 | |
| Оценка: | 48 (6) | |
Здравствуйте, Froland, Вы писали:
gcc3.2.2
vc6 vc7 (не STLPort)
#include "stdafx.h" #include #include #include int main(int argc, char * argv[]) < std::ifstream ar("stdafx.h", std::ios::in|std::ios::binary); std::istreambuf_iteratorchar> begin(ar), end; std::cout char('\n') ) return 0; >
Re: Как посчитать строки в файле?
| От: | menify |
| Дата: | 21.04.03 00:33 |
| Оценка: |
Здравствуйте, Froland, Вы писали:
F>Но есть большое НО – функция fgets заканчивает считывать строку только когда в конце есть ‘\n’, а этот символ стоит далеко не всегда(например, Когда в любом текстовом редакторе набираешь текст, то он при автопереносе на новую строку символ ‘\n’ не ставит) а без него этот алгоритм бесполезен
F>Подскажите, как сделать правильно
Незабывай, что бывают разные форматы переноса строки в текстовых файлах:
- CR+LF — Windows
- LF — UNIX
- CR — MAC
Как подсчитать количество строк в файле Linux
Известно, что программами с графическим интерфейсом удобней пользоваться, поскольку они рассчитаны на высокие требования, плюс терминал позволяет определенные задачи решать значительно быстрей. Так есть утилита wc, она может подсчитывает количество строк в файле. Число строк мало о чем говорит, а вот в случае, когда совмещается несколько команд, можно считать строки, учитывая необходимые параметры. Как подсчитать строк в файле Linux? Осветим пару простых, но эффективных примеров применения команд grep, sed и awk.
Узнаем число строк в файле Linux
Нами уже была рассмотрена команда WC, теперь следует ознакомиться с одним из ее ключевых параметров — -l. Он подсчитывает переходы на новую строку, то есть происходит подсчет всей строки, включая и пустые. С задачей справится команда справляется быстрей всех остальных, однако возможен только определенных строк — с заданным условием.
$ wc -l имя_файла
$ grep -c $ имя_файла
$ sed -n \$= имя_файла
$ awk ‘END< print NR >‘ имя_файла

Как видим, результат одинаков, но команде wc потребовалось меньше времени на выполнение поставленной задачи. Остальные команды применимы для сложных запросов. Команда grep позволяет обнаружить строки только с текстом: grep -c ‘текст’ имя_файла.

Команда grep обращается с регулярными выражениями, поэтому можно объединить несколько условий по типу И, ИЛИ, НЕ.
Когда sed выполняет обработку текста, но намного легче выполнить подсчет числа финальных строк командой wc. Можно удалить все строки, которые имеют длину менее трех символов, а сложных случаях подсчет символов осуществляется без комментариев.

Если задача простая. то ее можно выполнить и другими способами. Команда awk будет проще и понятней.

Для наглядного примера работы команды awk выполним подсчёт строк, одновременно с этим осуществляя поиск необходимого значения в табличном файле csv.
В примере выполним подсчет числа строк со значением второго параметра более 50.

Добавим 0 к выражению, чтобы убрать все нечисловые выражения.
Как подсчитать количество строк в файле?
Пытаюсь посчитать количество строк в файле (посимвольно считывая), но переменная считывает символы ‘H’ постоянно, их очень много, хотя файл всего на 3 строки из 3-х символов каждая (файл текстовый), что это может быть?
spoiler

- Вопрос задан более трёх лет назад
- 355 просмотров
Комментировать
Решения вопроса 1
Переменная file_ptr не инициализирована либо открытие файла произошло с ошибкой.
Ответ написан более трёх лет назад

ZIK1337 @ZIK1337 Автор вопроса
Нет, с этим все в порядке, перед подсчетом строк я сам заполняю файл, вот весь код:
#include #include #include int main(int argc, char **argv) < setlocale(LC_ALL, "Ru"); FILE *file_ptr; // указатель на файл (задание 1.1) int N; // количество строк и символов в строках (задание 1.1) int count=0; // для подсчета количества строк (задание 1.2) char ch; // для подсчета количества строк (задание 1.2) char text[50]="0"; file_ptr = fopen("D:\\f1.txt", "w+"); if (file_ptr != NULL) < printf("Введите количество строк в файле и символов в них (не более 10): \n"); scanf("%d", &N); if (N >10) < do < printf("Нужно ввести число не более 10! Повторите ввод: \n"); scanf("%d", &N); >while (N > 10); > printf("Введите строки не более %d символов.\n", N); for (int i = 0; i < N; i++) < printf("Введите %d-ю строку: \n", (i+1)); scanf("%s", text); if (strlen(text) >N) < do < printf("Нельзя вводить больше %d символов! Введите строку еще раз: \n", N); scanf("%s", text); >while (strlen(text) > N); fputs(text, file_ptr); fputs("\n", file_ptr); > else < fputs(text, file_ptr); fputs("\n", file_ptr); >> while ((ch = fgetc(file_ptr)) != EOF) < if (ch == '\n') ++count; >printf("Количество строк в файле: %d", count); //while (fgets(text, 50, file_ptr)) < // printf("%s", text); //>fclose(file_ptr); return 0; > else < printf("Невозможно открыть файл\n"); return 1; >_getch(); >
ZIK1337, кроме отсутствия вызова fseek, ошибок на первый взгляд нет. Скорее всего, неправильно подаются данные на вход (scanf).

ZIK1337 @ZIK1337 Автор вопроса
Антон Кутузов, просто набор символов типа «123», «adf» на каждую строку подаю

ZIK1337,

ZIK1337 @ZIK1337 Автор вопроса
Антон Кутузов, хм, и это серьезно из-за отсутствия fseek может быть? А не может ли из-за Visual Studio самого, что там по умолчанию заполняется так?