Как посчитать количество символов в файле си
Обновлено: 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.
Подсчет символов в строке:
Измерять длину очередной строки с помощью встроенный в язык программирования функции.
Подсчет слов в строке:
- Ввести счетчик слов и присвоить ему 0.
- Ввести флаговую переменную и присвоить ей 0 (сигнал нахождения вне слова).
- Пока не будет достигнут конец строки:
- Если очередной символ не пробел и флаг указывает на нахождение вне слова, то увеличить счетчик слов и присвоить флаговой переменной 1 (сигнал нахождения внутри слова).
- Если же очередной символ пробел, то присвоить флагу 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; ipython количество строк в файле
f = open('text.txt')
line = 0
for i in f:
line += 1flag = 0
word = 0
for j in i:
if j != ' ' and flag == 0:
word += 1
flag = 1
elif j == ' ':
flag = 0Hello 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
конЧитайте также: