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

Обновлено: 06.07.2024

Мне нужно написать код на C, который выводит количество символов, строк и слов в данном файле. Задача кажется простой, но я действительно не уверен, что пошло не так в этот момент.

Идея задачи заключается в том, что вывод должен быть таким же, как вывод команды wc в Linux. Но я совершенно не понимаю, почему в моем цикле пропускаются некоторые символы. То, как я написал код, должно позволять считать КАЖДЫЙ ОДИН символ, даже эти пробелы. Почему тогда моя программа показывает, что файл-образец содержит 65 символов, а wc показывает 68? Я подумал, что, возможно, есть какие-то символы, которые пропускает fgetc, но это невозможно, поскольку я использовал эту функцию раньше, когда писал программу для копирования содержимого одного текстового файла в другой, и все работало правильно.

Кстати, мое решение для подсчета слов правильное? Условие после цикла должно гарантировать, что учитывается последнее слово перед EOF. Я использовал isspace, чтобы убедиться, что в финале нет пробелов.

2 ответа

"Моя программа показывает, что файл примера содержит 65 символов, а wc показывает 68"

Вы работаете в Windows, и в вашем файле всего три строки? Если это так, проблема в том, что Windows сопоставляет окончания строк CRLF с символами новой строки, поэтому 3 пары CRLF сопоставляются с окончанием 3 строк (только LF) с учетом расхождения. Чтобы решить эту проблему, откройте файл в двоичном режиме.

Я думаю, что код для подсчета слов в порядке, не запустив код. Вместо этого вы можете использовать флаг «in-word», изначально установленный на 0 (false), и переключиться на true и подсчитать новое слово, когда вы обнаружите что-то, что не является пробелом, когда вы не в слове. Оба работают; они немного разные.

Также помните, что fgetc() и родственники возвращают int , а не char . Вы не можете надежно обнаружить EOF, если сохраните возвращаемое значение в char , хотя характер проблемы зависит от того, является ли простой char подписанным или беззнаковым, и от используемого набора кода.

Если простой char является беззнаковым типом, вы никогда не сможете обнаружить EOF (поскольку EOF отображается в 0xFF, и когда он преобразуется в int для сравнения с EOF, он является положительным). Если простой char подписан, если входные данные содержат код 0xFF (в ISO 8859-1 и связанных наборах кодов это ÿ - ЛАТИНСКАЯ СТРОЧНАЯ БУКВА Y С ДИАРЕЗИСОМ в терминологии Unicode), вы обнаружите EOF раньше. Однако действительный UTF-8 никогда не может содержать байт 0xFF (ни 0xC0, 0xC1, ни 0xF5..0xFF), поэтому вы не должны сталкиваться с этой проблемой неверной интерпретации - но тогда ваш код является подсчетом байтов, а не подсчетом символов.

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

Подсчет строк:
Ввести счетчик, присвоить ему 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
    кон

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