Как узнать длину строки в файле с

Обновлено: 06.07.2024

В текстовом файле посчитать количество строк, а также для каждой отдельной строки определить количество в ней символов и слов.

Подсчет строк:
Ввести счетчик, присвоить ему 0.
Пока не будет достигнут конец файла, считывать очередную строку файла и увеличивать счетчик на 1.

Подсчет символов в строке:
Измерять длину очередной строки с помощью встроенный в язык программирования функции.

Подсчет слов в строке:

  1. Ввести счетчик слов и присвоить ему 0.
  2. Ввести флаговую переменную и присвоить ей 0 (сигнал нахождения вне слова).
  3. Пока не будет достигнут конец строки:
    1. Если очередной символ не пробел и флаг указывает на нахождение вне слова, то увеличить счетчик слов и присвоить флаговой переменной 1 (сигнал нахождения внутри слова).
    2. Если же очередной символ пробел, то присвоить флагу 0.

    Pascal


    Файл выполнен в среде GNU/Linux, компилятор FreePascal. Русские символы считаются за 2 символа. Например, в данном примере во второй строке 9 кириллических символа, пробел и восклицательный знак: 18 + 2 = 20 символов.

    Язык Си

    посчитать количество строк в файле си


    Тот же "эффект", что и в Паскале: кириллический символ считается за 2.

    Функция fgets() считывает строку вместе с символом перехода на новую строку. Аргумент N не позволяет считать больше указанного количества символов, но длина строки определяется по количеству считанных (т.е. фактической длиной строки).

    Python

    python количество строк в файле


    Символ перехода на новую строку учитывается.

    КуМир

    Здесь считается общее количество слов и символов.

    Basic-256


    Переход на новую строку учитывается как символ.


    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, ' - ');

    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 символов.

    посчитать количество строк в файле си

    word = 0;
    flag = 0;
    for (i=0; i

    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

    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
    кон

    Какие плюсы и минусы использования? Что быстрее и где лучше применять тот или иной вариант?


    49.4k 72 72 золотых знака 249 249 серебряных знаков 480 480 бронзовых знаков

    Главное различие в том, что функция strlen вычисляет длину строки, а оператор sizeof к вычислению длины строки никакого отношения не имеет. Оператор sizeof используется для определения размера памяти занимаемой сущностью. При работе со строками он может быть применим только к строкам, определенным на стеке и константным строкам. Механизм работы можно увидеть на примере:

    9,115 6 6 золотых знаков 19 19 серебряных знаков 52 52 бронзовых знака


    49.4k 72 72 золотых знака 249 249 серебряных знаков 480 480 бронзовых знаков

    sizeof - это оператор языка, применяемый для определения размера типа данных в байтах. Значение выражения с использованием sizeof определяется во время компиляции кода, за исключением ряда случаев, например, для массивов переменной длины, определенных в C99.

    strlen - это функция стандартной библиотеки C, применяемая для определения длины строки, оканчивающейся нулем. Значение выражения с использованием вызова strlen определяется во время выполнения кода.

    33.8k 23 23 золотых знака 89 89 серебряных знаков 208 208 бронзовых знаков

    Обращу внимание, что sizeof возвращает размер объекта в байтах. Т.е. обычно это максимальная длина строки, которая влезает в массив char'ов.

    strlen - это функция стандартной библиотеки для определения длины 0-terminated строки. Возвращает кол-во символов без терминирующего 0. Т.е. реально занимаемый в памяти объем строки равен как минимум результату выполнения strlen + 1 байт.

    Реально проблемы обычно возникают при работе с Юникодом, т.е. с типами wchar или TCHAR и соответствующими ф-циями. Потому что юникодовские символы занимают не 1 байт, а 2. И поэтому смешивать кол-во символов и размер их в памяти, получается, уже не стоит. А учитывая, что многие программы рано или поздно придется переделывать - лучше сразу заложить возможность для этого. Т.е. итого - запоминаем, что ф-ции работы со строками обычно требуют размер (или макс. размер) строки в символах, а ф-ции работы с памятью - обычно в байтах.

    Для определения максимального кол-ва элементов (т.е. символов в строке) под MSVC я использовал макрос _countof. Мне он показался достаточно удобным.

    При создании строки не помешало бы указать её длину и ёмкость (или хотя бы знать эти параметры).

    Длина std::string

    size_type string::length() const

    size_type string::size() const

    Обе эти функции возвращают текущее количество символов, которые содержит строка, исключая нуль-терминатор. Например:

    Хотя также можно использовать функцию length() для определения того, содержит ли строка какие-либо символы или нет, эффективнее использовать функцию empty():

    bool string::empty() const — эта функция возвращает true , если в строке нет символов, и false — в противном случае.

    std :: cout << ( sString1 . empty ( ) ? "true" : "false" ) << std :: endl ; std :: cout << ( sString2 . empty ( ) ? "true" : "false" ) << std :: endl ;

    Есть еще одна функция, связанная с длиной строки, которую вы, вероятно, никогда не будете использовать, но мы все равно её рассмотрим:

    size_type string::max_size() const — эта функция возвращает максимальное количество символов, которое может хранить строка. Это значение может варьироваться в зависимости от операционной системы и архитектуры операционной системы.

    Ёмкость std::string

    size_type string::capacity() const — эта функция возвращает количество символов, которое может хранить строка без дополнительного перераспределения/перевыделения памяти.

    std :: cout << "Capacity: " << sString . capacity ( ) << std :: endl ;

    Length: 10
    Capacity: 15

    Примечание: Запускать эту и следующие программы следует в полноценных IDE, а не в веб-компиляторах.

    Обратите внимание, ёмкость строки больше её длины! Хотя длина нашей строки равна 10, памяти для неё выделено аж на 15 символов! Почему так?

    Здесь важно понимать, что, если пользователь захочет поместить в строку больше символов, чем она может вместить, строка будет перераспределена и, соответственно, ёмкость будет больше. Например, если строка имеет длину и ёмкость равную 10, то добавление новых символов в строку приведет к её перераспределению. Делая ёмкость строки больше её длины, мы предоставляем пользователю некоторое буферное пространство для расширения строки (добавление новых символов).

    Но в перераспределении есть также несколько нюансов:

    Во-первых, это сравнительно ресурсозатратно. Сначала должна быть выделена новая память. Затем каждый символ строки копируется в новую память. Если строка большая, то тратится много времени. Наконец, старая память должна быть удалена/освобождена. Если вы делаете много перераспределений, то этот процесс может значительно снизить производительность вашей программы.

    Во-вторых, всякий раз, когда строка перераспределяется, её содержимое получает новый адрес памяти. Это означает, что все текущие ссылки, указатели и итераторы строки становятся недействительными!

    Обратите внимание, не всегда строки создаются с ёмкостью, превышающей её длину. Рассмотрим следующую программу:

    Файл String.h содержит прототипы функций работы со строками C.

    Прямо сейчас на примерах рассмотрим Си функции работы со строками.

    strcmp

    Сравнение строк в C, пример:

    Две C строки объявлены в примере. Они одинаковы. Предложим функции сравнения строк в C strcmp сравнить эти строки. Прототип функции strcmp в файле String.h:

    Если символы строки _Str1 раньше встречаются в алфавите, то _Str1 больше, чем _Str2 и результат функции будет меньше нуля. Если они равны, как в примере, то результат равен нулю. Если символы строки _Str2 раньше встречаются в алфавите, то _Str2 больше, чем _Str1 и результат функции будет меньше нуля. Функция strcmp различает большие и маленькие буквы.

    C String

    В примере строки равны, поэтому получаем:

    Нулевой результат говорит о том, что строки равны.

    stricmp

    Ещё одна функция сравнения строк в Си в файле String.h

    игнорирует разницу больших и маленьких букв, в остальном такая же как и strcm.

    strlen

    Длину строки в Си определяет функция strlen из файла String.h:

    Функция strlen возвращает длину строки C в виде количества байтов. Пример strlen:

    strlen

    Получаем:

    В примере строка “stroka” содержит 6 символов. Функция определения длины строки C strlen выдаёт результат 6 байтов, т.е. одному символу соответствует один байт. Так оно и есть на самом деле.

    strcpy

    strcpy – копирование строк в C. Это ещё одна функция работы со строками C. Пример копирования строки в Си:

    В примере создаём массив cMassiv для элементов типа char, и строку szStr. Функция strcpy копирует szStr в первый элемент массива, т.е. в cMassiv[0].

    strcpy

    Получаем:

    Прототип функции strcpy:

    strncpy

    strncpy – копирование строк в C. Это ещё одна функция работы со строками C. Пример копирования строки в Си:

    strncpy

    Получаем:

    В примере создаём массив cMassiv для элементов типа char, и строку szStr. Функция strcpy копирует szStr в первый элемент массива, т.е. в cMassiv[0]. А далее с помощью функции strncpy копируем 3 первых символа строки szStr2 в строку, хранящуюся в первом элементе массива, т.е. в cMassiv[0].

    Прототип функции strncpy:

    char * strcpy(char * _Dst, const char * _Src, size_t _MaxCount);

    strcat

    strcat – конкатенация строк в C, т.е. присоединение одной строки к другой. Это ещё одна функция работы со строками C. Пример конкатенации строки в Си:

    strcat

    Получаем:

    Прототип функции strcat:

    strncat

    strncat – конкатенация строк в C, т.е. присоединение одной строки к другой. Это ещё одна функция работы со строками C. Пример конкатенации строки в Си:

    strcat

    Получаем:

    Здесь прибавляем три символа втрой строки к первой.

    Прототип функции strncat:

    char * strncat(char * _Dst, const char * _Src, size_t _MaxCount);

    strstr

    strstr – поиск первого вхождения одной строки в другую. Это ещё одна функция работы со строками C. Пример в Си:

    strstr

    Получаем:

    В программе строки могут определяться следующим образом:

    • как строковые константы;
    • как массивы символов;
    • через указатель на символьный тип;
    • как массивы строк.

    Кроме того, должно быть предусмотрено выделение памяти для хранения строки.

    Под хранение строки выделяются последовательно идущие ячейки оперативной памяти. Таким образом, строка представляет собой массив символов. Для хранения кода каждого символа строки отводится 1 байт.

    Строковые константы размещаются в статической памяти. Начальный адрес последовательности символов в двойных кавычках трактуется как адрес строки. Строковые константы часто используются для осуществления диалога с пользователем в таких функциях, как printf() .

    При определении массива символов необходимо сообщить компилятору требуемый размер памяти.

    Компилятор также может самостоятельно определить размер массива символов, если инициализация массива задана при объявлении строковой константой:

    char m2[]= "Горные вершины спят во тьме ночной." ;
    char m3[]=< 'Т','и','х','и','е',' ','д','о','л','и','н','ы',' ','п','о','л','н','ы',' ','с','в','е','ж','е','й',' ','м','г','л','о','й','\0' >;

    В этом случае имена m2 и m3 являются указателями на первые элементы массивов:


    При объявлении массива символов и инициализации его строковой константой можно явно указать размер массива, но указанный размер массива должен быть больше, чем размер инициализирующей строковой константы:

    Для задания строки можно использовать указатель на символьный тип .

    В этом случае объявление массива переменной m4 может быть присвоен адрес массива:

    m4 = m3;
    *m4 эквивалентно m3[0]= 'Т'
    *(m4+1) эквивалентно m3[1]= 'и'

    Здесь m3 является константой-указателем. Нельзя изменить m3 , так как это означало бы изменение положения (адреса) массива в памяти, в отличие от m4 .

    Для указателя можно использовать операцию увеличения (перемещения на следующий символ):

    Массивы символьных строк

    Иногда в программах возникает необходимость описание массива символьных строк . В этом случае можно использовать индекс строки для доступа к нескольким разным строкам.

    Инициализация выполняется по правилам, определенным для массивов.
    Тексты в кавычках эквивалентны инициализации каждой строки в массиве. Запятая разделяет соседние
    последовательности.
    Кроме того, можно явно задавать размер строк символов, используя описание, подобное такому:

    Разница заключается в том, что такая форма задает «прямоугольный» массив, в котором все строки имеют одинаковую длину.

    Массив строк

    Свободный массив


    определяет свободный массив, где длина каждой строки определяется тем указателем, который эту строку инициализирует. Свободный массив не тратит память напрасно.

    Операции со строками

    Большинство операций языка Си, имеющих дело со строками, работает с указателями. Для размещения в оперативной памяти строки символов необходимо:

    • выделить блок оперативной памяти под массив;
    • проинициализировать строку.

    Для выделения памяти под хранение строки могут использоваться функции динамического выделения памяти. При этом необходимо учитывать требуемый размер строки:

    Функции ввода строк

    Для ввода строки может использоваться функция scanf() . Однако функция scanf() предназначена скорее для получения слова, а не строки. Если применять формат "%s" для ввода, строка вводится до (но не включая) следующего пустого символа, которым может быть пробел, табуляция или перевод строки.

    Для ввода строки, включая пробелы, используется функция

    В качестве аргумента функции передается указатель на строку, в которую осуществляется ввод. Функция просит пользователя ввести строку, которую она помещает в массив, пока пользователь не нажмет Enter.

    Функции вывода строк

    Для вывода строк можно воспользоваться рассмотренной ранее функцией

    или в сокращенном формате

    Для вывода строк также может использоваться функция

    которая печатает строку s и переводит курсор на новую строку (в отличие от printf() ). Функция puts() также может использоваться для вывода строковых констант, заключенных в кавычки.

    Функция ввода символов

    Для ввода символов может использоваться функция

    которая возвращает значение символа, введенного с клавиатуры. Указанная функция использовалась в рассмотренных ранее примерах для задержки окна консоли после выполнения программы до нажатия клавиши.

    Функция вывода символов

    Для вывода символов может использоваться функция

    которая возвращает значение выводимого символа и выводит на экран символ, переданный в качестве аргумента.

    Пример Посчитать количество введенных символов во введенной строке.

    Количество введенных символов в строке

    Результат выполнения

    Читайте также: