Подсчет символов, строк и слов
Программа считает количество введенных пользователем символов, строк и слов. Чтобы программа корректно закончила работу и правильно посчитала, после набора строк надо перейти на новую строку, после чего нажать 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
Подсчет символов в файле
Ребят, подскажите, пожалуйста как подсчитать количество символов в файле? wc -m $filename выдает 213 символов, Openoffice 209. Всего 6 текстовых файлов и ни в одном не показывает правильно. Я не прошу готовых решений, подскажите хотя бы что почитать на эту тему.
Текст одного из файлов: По укороченному маршруту данный транспорт будет курсировать 24 и 25 сентября с 10:00 до 16:00. Об этом сообщила пресс-служба мэрии. Ограничение связано с проведением ремонта плитки в районе кинотеатра Киномакс.
buganych
24.09.11 16:52:49 MSK
← 1 2 →

Тебе только печатаемые символы для расчёта з/п надо подсчитать?
adriano32 ★★★
( 24.09.11 16:55:18 MSK )
Ответ на: комментарий от adriano32 24.09.11 16:55:18 MSK
Да. Чтобы и офис и мой скрипт выдавали одно и то же. Не пойму откуда лишние символы появляются. их от 4 до 14 пока и зависимости не могу проследить ни от количества символов ни от количества строк
buganych
( 24.09.11 16:59:51 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 16:59:51 MSK

лишние переводы строк, табуляции и тому подобное. wc их считает, OOO видимо нет. Хочешь посчитать только печатаемые символы, sed’ом убери из файла все пробелы, табы, переводы строк и проч., а потом натравливай wc.
adriano32 ★★★
( 24.09.11 17:05:21 MSK )
Ответ на: комментарий от buganych 24.09.11 16:59:51 MSK
Подозреваю что виноваты символы перевода строк и прочие символы табуляции я прав?
buganych
( 24.09.11 17:05:47 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 17:05:47 MSK
sed -e ‘s/^[ \t]*//g’ -e ‘s/[ \t]*$//g’ Не уверен но вроде так убираются все символы табуляции?
buganych
( 24.09.11 17:09:01 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 17:05:47 MSK
Хм, а и правда: wc тупо сообщает размер текстового файла. А я-то думал, он действительно символы считает.
11.09.24 17:11 /tmp wc -m 1 34 1 11.09.24 17:11 /tmp wc -c 1 34 1 11.09.24 17:11 /tmp ls -l 1 -rw-r--r-- 1 eddy eddy 34 сент. 24 17:11 1 11.09.24 17:12 /tmp cat 1 превед пока hello goodbye 2432134
Eddy_Em ☆☆☆☆☆
( 24.09.11 17:11:43 MSK )
Ответ на: комментарий от Eddy_Em 24.09.11 17:11:43 MSK
А количество слов как в аптеке подсчитывает
buganych
( 24.09.11 17:16:01 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 17:16:01 MSK
А вот с символами что-то косяк. Могли бы разработчики добавить туда еще ключей, чтобы можно было не считать непечатаемые символы, пробелы и т.п.
Eddy_Em ☆☆☆☆☆
( 24.09.11 17:18:23 MSK )
Ответ на: комментарий от buganych 24.09.11 17:16:01 MSK
sed -e ‘s/^[ \t]*//;s/[ \t]*$//’ Даже с этой строчкой картина не изменилась ((
buganych
( 24.09.11 17:18:38 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 17:18:38 MSK

Выложи оригинальный файл, чё тянешь резину?
adriano32 ★★★
( 24.09.11 17:23:36 MSK )
Ответ на: комментарий от buganych 24.09.11 17:18:38 MSK
А подскажите, пожалуйста как использовать в sed`e (2)l -заменить непечатаемые символы на ASCII
buganych
( 24.09.11 17:23:37 MSK ) автор топика
Ответ на: комментарий от adriano32 24.09.11 17:23:36 MSK
buganych
( 24.09.11 17:27:35 MSK ) автор топика
Ответ на: комментарий от Eddy_Em 24.09.11 17:11:43 MSK
>Хм, а и правда: wc тупо сообщает размер текстового файла. А я-то думал, он действительно символы считает.
Во _всех_ манах coreutils и подобных утилит следует читать characters как bytes. Но всем как обычно пофиг.
x3al ★★★★★
( 24.09.11 17:31:14 MSK )
Ответ на: комментарий от x3al 24.09.11 17:31:14 MSK
Ну, в принципе-то 1байт == 1 символ. Другое дело, что многие символы не считаются буквами или вообще печатными символами.
Eddy_Em ☆☆☆☆☆
( 24.09.11 17:34:06 MSK )
Ответ на: комментарий от buganych 24.09.11 17:27:35 MSK

Если хочешь, чтобы тебе помогли, не выкладывай на файлообменки, где надо ждать минуту загрузку.
А теперь признавайся, в чём набирал, что у тебя вендовые переносы 0x0D0A?
По укороченному маршруту данный транспорт будет курсировать 24 и 25 сентября с 10:00 до 16:00. Об этом сообщила пресс-служба мэрии.^M Ограничение связано с проведением ремонта плитки в районе кинотеатра Киномакс.^M
Дважды ^M это и есть по два байта 0x0D0A, которые сканывают за лишние четыре символа, являясь вендовыми переносами вместо просто переноса 0x0A. В венде набирал?
adriano32 ★★★
( 24.09.11 17:34:16 MSK )
Ответ на: комментарий от Eddy_Em 24.09.11 17:34:06 MSK
>1байт == 1 символ.
man многобайтные кодировки, комбинирующие символы, суррогатные пары etc.
x3al ★★★★★
( 24.09.11 17:35:33 MSK )
Ответ на: комментарий от x3al 24.09.11 17:35:33 MSK

У него KOI8 до сих пор.
kss ★★★★★
( 24.09.11 17:39:54 MSK )
Ответ на: комментарий от adriano32 24.09.11 17:34:16 MSK
нет, на сайте кодировка cp1251 может из за этого. Хотя перекодировал в utf8 с помощью iconv. Я работаю в виртуальной машине под Opensuse. А как бы эти переносы убрать? sed’oм не хочет фильтровать их
buganych
( 24.09.11 17:40:32 MSK ) автор топика
Ответ на: комментарий от kss 24.09.11 17:39:54 MSK
где koi8. Там ему просто неоткуда появиться
buganych
( 24.09.11 17:41:17 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 17:40:32 MSK

sed -i «s/[Ctrl+V][Ctrl+M]//g» 2.txt
adriano32 ★★★
( 24.09.11 17:45:59 MSK )
Ответ на: комментарий от adriano32 24.09.11 17:45:59 MSK
Не работает (( Попробовал sed -e «s/^M//g» та же самая ситуация, все те же 213 вместо 209 символов
buganych
( 24.09.11 17:52:01 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 17:41:17 MSK

>где koi8. Там ему просто неоткуда появиться
kss ★★★★★
( 24.09.11 17:52:03 MSK )
Ответ на: комментарий от buganych 24.09.11 17:52:01 MSK

Ты совсем? то что ты попробовал, твой исходный файл не изменяло, а просто выдало в stdout результат. Для того я -i выше и передал sed’y. Так 211 будет.
adriano32 ★★★
( 24.09.11 17:54:37 MSK )
Ответ на: комментарий от adriano32 24.09.11 17:54:37 MSK
если точнее я просто взял и в терминале набрал sed -e «s/^M//g» 2.txt>2a.txt; wc -m 2a.txt 213 2а.txt
buganych
( 24.09.11 17:56:17 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 17:56:17 MSK
buganych
( 24.09.11 18:02:16 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 18:02:16 MSK
buganych
( 24.09.11 18:03:31 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 17:56:17 MSK

$ sed "s/[^M]//g" 2.txt | tr -d '\n' | wc -m 209
adriano32 ★★★
( 24.09.11 18:06:43 MSK )
Ответ на: комментарий от adriano32 24.09.11 18:06:43 MSK
Видимо у меня действительно кривые руки, у меня показывает 0 ((
buganych
( 24.09.11 18:12:49 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 18:12:49 MSK
Он вообще весь текст удалил
buganych
( 24.09.11 18:16:36 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 18:16:36 MSK

adriano32 ★★★
( 24.09.11 18:17:56 MSK )
Ответ на: комментарий от adriano32 24.09.11 18:17:56 MSK
Как есть, сам понять не могу почему так
buganych
( 24.09.11 18:20:16 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 18:20:16 MSK

выполни sed «s/[^M]//g» 2.txt | tr -d ‘\n’ | wc -m
adriano32 ★★★
( 24.09.11 18:21:40 MSK )
Ответ на: комментарий от adriano32 24.09.11 18:21:40 MSK
buganych@linux-qvlt:~/Downloads> sed «s/[^M]//g» 2.txt | tr -d ‘\n’ | wc -m 0
buganych
( 24.09.11 18:26:24 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 18:26:24 MSK

sed «s/[^M]//g» 2.txt | tr -d ‘\n’
adriano32 ★★★
( 24.09.11 18:27:49 MSK )
Ответ на: комментарий от adriano32 24.09.11 18:27:49 MSK
sed «s/[^M]//g» 2.txt>2a.txt | tr -d ‘\n’ на wc -m выдает 2
buganych
( 24.09.11 18:30:41 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 18:30:41 MSK

ой, лучше уже считай вручную.
Покажи просто, без всяких >2a.txt
sed «s/[^M]//g» 2.txt ([Ctrl+V][Ctrl+M], а то ты наверняка текстом скопировал)
sed «s/[^M]//g» 2.txt | tr -d ‘\n’
adriano32 ★★★
( 24.09.11 18:33:33 MSK )
Ответ на: комментарий от adriano32 24.09.11 18:33:33 MSK
buganych@linux-qvlt:~/Downloads> cat 2.txt;sed «s/[^M]//g» 2.txt;sed «s/[^M]//g» 2.txt | tr -d ‘\n’ По укороченному маршруту данный транспорт будет курсировать 24 и 25 сентября с 10:00 до 16:00. Об этом сообщила пресс-служба мэрии. Ограничение связано с проведением ремонта плитки в районе кинотеатра Киномакс. и ****************__cat 2.txt;sed «s/[Ctrl+V][Ctrl+M]//g» 2.txt;sed «s/[^M]//g» 2.txt | tr -d ‘\n’ По укороченному маршруту данный транспорт будет курсировать 24 и 25 сентября с 10:00 до 16:00. Об этом сообщила пресс-служба мэрии. Ограничение связано с проведением ремонта плитки в районе кинотеатра Киномакс. По укороченному маршруту данный транспорт будет курсировать 24 и 25 сентября с 10:00 до 16:00. Об этом сообщила пресс-служба мэрии. Ограничение связано с проведением ремонта плитки в районе кинотеатра Киномакс.
buganych
( 24.09.11 18:43:00 MSK ) автор топика
Ответ на: комментарий от buganych 24.09.11 18:43:00 MSK

Это три отдельные команды. отдельно результаты покажи, поместив в теги [code][/code]
Как узнать количество символов в файле c
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
Открываем файл на чтение и в цикле считаем.
Нет?
Форумчанин
Регистрация: 22.12.2011
Сообщений: 378
Вид цикла такой?
#define EOF (-1) ifstream input(***.***); char szPeremen; int nN = 0; while((szPeremen = input.get()) != EOF) nN++; //Число символов
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
Ну что-то в этом роде.
Только так оно и пробелы считает.
Есть функции типа isgraph, isalpha и прочие.
Все доступно в справке.
Человек с головой всегда найдет нужное.
Форумчанин
Регистрация: 22.12.2011
Сообщений: 378
Ну спасибо за комплимент)))Я сюда и пишу чтоб найти нужное)))
Можно и использовать и .get() если условие отбрасывания пробелов добавить
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
Белик Виталий 🙂
Регистрация: 23.07.2007
Сообщений: 57,792
| узнать количество символов в файле |
Что-т не пойму: Размер файла говорит о кол-ве символов в нем, значит из него ничего читать не нужно, просто применить функцию выяснения размера.
или речь идет о читаемых символах?
I’m learning to live.
Форумчанин
Регистрация: 22.12.2011
Сообщений: 378
Ну допустим в файле записано предложение: «Это предложение записано в файл» и нужно создать массив размером как это предложение. То есть чтоб не выделять больше памяти чем нужно вот я и думал:
1. Сначала подсчитывается количество символов и пробелов тоже в файле.
2. Затем количество сохраняется в переменной
3. Создается динамический массив, размером которого является эта переменная
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
Форумчанин
Регистрация: 22.12.2011
Сообщений: 378
Да на счет размера файла я знаю. Но хочу как нить без этого. Притом что я функцию размера файла то не знаю
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636
fseek(file,SEEK_END); long size = ftell (file);
| Похожие темы | ||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Замена символов в текстовом файле | Deniskarey | Общие вопросы C/C++ | 0 | 15.12.2011 23:49 |
| Что делать, если количество символов в билдере не соответствует количеству символов в билде? | BoT_T | Общие вопросы Delphi | 0 | 16.11.2010 10:42 |
| Количество строк в файле | Demien | Общие вопросы Delphi | 3 | 17.08.2009 18:48 |
| Посчитать количество символов в файле | Sabyr | Помощь студентам | 1 | 31.05.2009 18:50 |
| количество цифр и количество символов до первой гласной буквы | 111111 | Общие вопросы C/C++ | 2 | 22.12.2008 12:15 |
как узнать количество символов в файле c#
Что бы не загружать весь файл целиком в память можно так:
var charCount = 0; using (var reader = new StreamReader(@"path_to_file", detectEncodingFromByteOrderMarks: true)) < while (reader.Read() >-1) < charCount++; >>
Отслеживать
ответ дан 6 июл 2016 в 17:08
1,201 6 6 серебряных знаков 16 16 бронзовых знаков
+1, но тогда уж лучше в буфер блоками читать, а не посимвольно.
7 июл 2016 в 5:59
Так StreamReader по блокам в память и читает, одна из перегрузок конструктора позволяет этот буфер задать. По умолчанию 4096 байт.
7 июл 2016 в 7:10
Мне кажется всё-таки цикл наподобие char[] buff = new char[buffSize]; int cntRead = 0; while ((cntRead = reader.Read(buff, 0, buffSize)) > 0) charCount += cntRead; быстрее проскочит.
7 июл 2016 в 7:59
Возможно, не проверял. В ответе я показал работающий пример и достаточно простой для понимания, а вот как его развить дальше дело программиста.