Считать текст из файла и вывести количество повторений букв - C (СИ)
Формулировка задачи:
Программа считывает текст из файла и выводит количество повторений букв, при этом приравнивая заглавные к прописным, затем выводит аски код текста.Работает только со строкой. Переделать так, чтобы могла работать с несколькими строками.Заранее спасибо.
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define maxsize 100
main()
{
char s[maxsize],simvol, freq[256];
int i, k, len;
FILE *lw11;
lw11=fopen("C:\\1.txt", "rw");
fgets(s,256,lw11);
fclose(lw11);
printf("Text:%s\n\n",s);
strupr(s);//перевод в прописные
len=strlen(s);//длина строки
memset(freq, 0, sizeof(freq));//заполняем массив частоты нулями
for(i = 0; s[i]!='\0'; i++)
if(s[i]!=' ' && s[i]!='\n')//игнорируем пробелы и энтеры
freq[s[i]]++;
for(i = 0; i < sizeof(freq); i++)
if(freq[i])
printf("%c %d\n", i, freq[i]);
printf("\nCode:");
for(k=0;k<len;k++)
if(s[k]!=' ')//игнорируем пробелы
printf(" %d",((int)s[k]));
getch();
return 0;
}Решение задачи: «Считать текст из файла и вывести количество повторений букв»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <locale.h>
int main( int argc, char ** argv )
{
setlocale( LC_ALL, "ru_RU.UTF-8" );
#define FILE_NAME_SIZE 256
char file_name[ FILE_NAME_SIZE ];
if( argc > 1 )
strncpy( file_name, argv[ 1 ], FILE_NAME_SIZE );
else
{
fputs( "Введите имя файла\n> ", stdout );
fgets( file_name, FILE_NAME_SIZE, stdin );
size_t len = strlen( file_name );
if( len == 0 || --len == 0 )
return 1;
file_name[ len ] = 0;
}
FILE * fd = fopen( file_name, "rb" );
if( !fd )
{
perror( file_name );
return 1;
}
// сюда читаем участок файла
#define STR_BUFF_SIZE 4096
char str_buff[ STR_BUFF_SIZE ];
// статистика по количеству символов
#define STATS_SIZE 256
unsigned stats[ STATS_SIZE ] = { 0 };
// то, что мы вывели на экран в этой (экранной) строке
#define SCREEN_BUFF_SIZE 17
char screen_buff[ SCREEN_BUFF_SIZE ];
size_t screen_chars = 0;
size_t file_pos = 0;
//while( fgets( str_buff, STR_BUFF_SIZE, fd ) )
while( !feof( fd ) && !ferror( fd ) && fread( str_buff, 1, STR_BUFF_SIZE, fd ) )
{
char * ptr = str_buff;
for( ; *ptr; ptr++ )
{
// выводим смещение от начала файла
if( !screen_chars )
{
printf( ".% 0.8X: ", file_pos );
file_pos += SCREEN_BUFF_SIZE - 1;
}
// переводим в верхний регистр (условие задачи)
if( isprint( *ptr ) )
*ptr = toupper( *ptr );
// при чтении русского текста из UTF-8 файла
// почему-то в char читаются 4 байта
// первые три заполняются 0xFF. обрезаем их
// но почему - вопрос интересный
stats[ *ptr & 0x000000ff ]++;
// или такое происходит при выводе printf
printf( "% 0.2X ", *ptr & 0x000000ff );
// если это непечатаемый символ или пробел,
// выводим его как точку
screen_buff[ screen_chars++ ] =
( !isprint( *ptr ) || isspace( *ptr ) ) ?
'.' : *ptr;
screen_buff[ screen_chars + 1 ] = 0;
// если мы вывели два слова (16 байт) из файла,
// выводим эти байты в читабельном виде
if( screen_chars == SCREEN_BUFF_SIZE - 1 )
{
printf( "| %s\n", screen_buff );
screen_chars = 0;
}
}
}
fclose( fd );
// выводим последнюю строку и заголовок раздела статистики
while( ++screen_chars < SCREEN_BUFF_SIZE )
printf( " " );
printf( "| %s\n\nСтатистика:\nКод Смв Част Гистограмма\n", screen_buff );
size_t i = 0;
// ищем максимальное количество вхождений символов (для гистограммы)
size_t max_stat = 0;
for( ; i < STATS_SIZE; i++ )
{
if( stats[ i ] > max_stat )
max_stat = stats[i];
}
// выводим статистику
for( i = 0 ; i < STATS_SIZE; i++ )
{
if( stats[ i ] )
{
printf( "% 0.2X %c %4d |", i, ( isprint( i ) && !isspace( i ) ) ? i : ' ', stats[i] );
// рисуем гистограмму
size_t u = 0;
for( ; u < ( 61.0 / max_stat * stats[ i ] ); u++ )
putchar( '-' );
// дорисовываем оставшееся место пробелами
while( ++u <= 61 )
putchar( ' ' );
// в конце гистограммы рисуем правую границу
puts( "|" );
}
}
return 0;
}