Как посчитать количество строк в файле 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
Подсчёт количества строк в текстовом файле
Во многих редакторах при работе с текстовым документом вы можете видеть, сколько всего строк содержится в этом файле. Строки между собой разделяются символом перевода строки, который в каждой операционной системе (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%.
Подсчет символов, строк и слов
Программа считает количество введенных пользователем символов, строк и слов. Чтобы программа корректно закончила работу и правильно посчитала, после набора строк надо перейти на новую строку, после чего нажать Ctrl + D (по крайней мере в терминале Linux).
#include int main() < char ch, flag=-1; unsigned c=0; // символы unsigned w=0; // слова unsigned n=0; // строки while ((ch = getchar()) != EOF) < if (ch == '\n') n++; else c++; if (ch == ' ' || ch == '\n') flag = -1; else if (flag == -1) < flag = 1; w++; >> printf("Символы: %u\n", c); printf(" Слова: %u\n", w); printf(" Строки: %u\n", n); >
one two three four Символы: 16 Слова: 4 Строки: 3
X Скрыть Наверх
Решение задач на языке C
Посчитать количество строк в файле и количество слов и символов в каждой строке
В текстовом файле посчитать количество строк, а также для каждой отдельной строки определить количество в ней символов и слов.
Подсчет строк:
Ввести счетчик, присвоить ему 0.
Пока не будет достигнут конец файла, считывать очередную строку файла и увеличивать счетчик на 1.
Подсчет символов в строке:
Измерять длину очередной строки с помощью встроенный в язык программирования функции.
Подсчет слов в строке:
- Ввести счетчик слов и присвоить ему 0.
- Ввести флаговую переменную и присвоить ей 0 (сигнал нахождения вне слова).
- Пока не будет достигнут конец строки:
- Если очередной символ не пробел и флаг указывает на нахождение вне слова, то увеличить счетчик слов и присвоить флаговой переменной 1 (сигнал нахождения внутри слова).
- Если же очередной символ пробел, то присвоить флагу 0.
Pascal
var
f: text;
s: string;
line, chr, wrd: word;
i: byte;
flag: boolean;
begin
assign(f,'text.txt');
reset(f);
line := 0;
while not EOF(f) do begin
readln(f,s);
write(s, ' - ');
line := line + 1;
chr := length(s);
write(chr, ' симв., ');
wrd := 0;
flag := false;
for i:=1 to chr do
if (s[i] <> ' ') and (flag = false) then begin
wrd := wrd + 1;
flag := true;
end
else
if s[i] = ' ' then flag := false;
writeln(wrd, ' сл.');
end;
close(f);
writeln(line,' стр.');
end.
Hello world! - 12 симв., 2 сл.
Привет мир! - 20 симв., 2 сл.
One, two, three - 15 симв., 3 сл.
Один, два, три - 24 симв., 3 сл.
4 стр.
Файл выполнен в среде GNU/Linux, компилятор FreePascal. Русские символы считаются за 2 символа. Например, в данном примере во второй строке 9 кириллических символа, пробел и восклицательный знак: 18 + 2 = 20 символов.
Язык Си
посчитать количество строк в файле си
#include < stdio.h>
#include < string.h>
#define N 255
main() FILE *f;
char s[N];
unsigned short line, word, flag, i;
line = 0;
f = fopen("text.txt","r");
while (fgets(s, N, f) != NULL) line += 1;
word = 0;
flag = 0;
for (i=0; i < strlen(s); i++)
if (s[i] != ' ' && flag == 0) word += 1;
flag = 1;
> else
if (s[i] == ' ') flag = 0;
printf("%s\t%ld симв., %d сл.\n",s,strlen(s),word);
>
printf("%d стр.\n", line);
fclose(f);
>
Hello world!
13 симв., 2 сл.
Привет мир!
21 симв., 2 сл.
One, two, three
16 симв., 3 сл.
Один, два, три
25 симв., 3 сл.
4 стр.Тот же «эффект», что и в Паскале: кириллический символ считается за 2.
Функция fgets() считывает строку вместе с символом перехода на новую строку. Аргумент N не позволяет считать больше указанного количества символов, но длина строки определяется по количеству считанных (т.е. фактической длиной строки).
Python
python количество строк в файле
f = open('text.txt')
line = 0
for i in f:
line += 1
flag = 0
word = 0
for j in i:
if j != ' ' and flag == 0:
word += 1
flag = 1
elif j == ' ':
flag = 0
print(i,len(i),'симв.',word,'сл.')
print(line,'стр.')
f.close()
Hello world!
13 симв. 2 сл.
Привет мир!
12 симв. 2 сл.
One, two, three
16 симв. 3 сл.
Один, два, три
15 симв. 3 сл.
4 стр.Символ перехода на новую строку учитывается.
КуМир
использовать Файлы П
алг
нач
цел f, line, word, char, in, i
лит s
line := 0
word := 0
char := 0
f := открыть на чтение ("текст.txt")
нц пока не конец файла (f)
Фввод f, s
line := line + 1
вывод s, нс
char := char + длин(s)
in := 0
нц для i от 1 до длин(s)
если s[i] <> " " и in = 0 то
word := word + 1
in := 1
иначе
если s[i] = " " то in := 0 все
все
кц
кц
закрыть(f)
вывод нс, "строк - ", line, нс
вывод "слов - ", word, нс
вывод "символов - ", char
кон
Привет, Мир!
Hello World!
5, 4 .
строк - 3
слов - 7
символов - 32Здесь считается общее количество слов и символов.
Basic-256
open "text.txt"
ln = 0
while not eof
ln = ln + 1
s$ = readline
i = 1
word = 0
flag = 0
while i c$ = mid(s$,i,1)
if c$ <> " " and flag = 0 then
word = word + 1
flag = 1
else
if c$ = " " then flag = 0
endif
i = i + 1
endwhile
print s$ + length(s$) + ", " + word
endwhile
close
print "Строк: " + ln
Hello world!
13, 2
Привет мир!
12, 2
One, two, three
16, 3
Один, два, три
15, 3
Строк: 4
Обработать неизвестное число строк из файла СИ
Решаю универскую задачку и встал вопрос: а как считать из файла неизвестное число строк исключительно на языке СИ? На с++ таких проблем нет, а вот как это сделать тут? Например, имею следующий код, который перенаправляет поток ввода из консоли в файл:
#include #include #include int main() < freopen("input.txt", "r", stdin); while (true) < char buff[100]; scanf("%s", buff); if (!strlen(buff))//пытаюсь таким образом определить конец файла break; >>На c++ можно остановить ввод с помощью !file.eof() , есть ли в данном случае сишная альтернатива? Заранее спасибо за ответ!
UPD: нашёл информацию о EOF и в си, но непонятно с чем сравнивать этот макрос в примере, чтоб понять — закончился ли файл.Отслеживать
Максим Герасимов
задан 20 фев 2022 в 15:25
Максим Герасимов Максим Герасимов
131 8 8 бронзовых знаков2 ответа 2
Сортировка: Сброс на вариант по умолчанию
«На c++ можно остановить ввод с помощью !file.eof() » — не стоит этого делать! См. Правильное использование проверки конца файла
Если уж читаете построчно — просто читайте while(fgets(buff,100,file))
Как подсчитать количество строк в файле?
Пытаюсь посчитать количество строк в файле (посимвольно считывая), но переменная считывает символы ‘H’ постоянно, их очень много, хотя файл всего на 3 строки из 3-х символов каждая (файл текстовый), что это может быть?
spoiler

- Вопрос задан более трёх лет назад
- 354 просмотра
Комментировать
Решения вопроса 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 самого, что там по умолчанию заполняется так?
Как посчитать количество строк в файле 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
Подсчёт количества строк в текстовом файле
Во многих редакторах при работе с текстовым документом вы можете видеть, сколько всего строк содержится в этом файле. Строки между собой разделяются символом перевода строки, который в каждой операционной системе (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%.