Пример 2



/* Подсчет количества вхождений каждой из букв алфавита в файл.

 * Выдача таблицы.

 * Подсчет частоты использования битов в байтах файла.

 */

#include <stdio.h>

#include <ctype.h>

long bcnt[8];

char masks[8] = {       /* маски битов */

	1, 2, 4, 8, 16, 32, 64, 128 };

long cnt[256];          /* счетчики для каждой из 256 букв */

/* распечатка букв в стиле языка СИ */

char *pr( c ){

	static char buf[ 20 ];

	switch( c ){

	case '\n': return   " \\n "   ;

	case '\r': return   " \\r "   ;

	case '\t': return   " \\t "   ;

	case '\b': return   " \\b "   ;

	case '\f': return   " \\f "   ;

	case '\033': return " ESC"    ;

	case '\0': return   " \\0 "   ;

	case 0177: return   " ^? "    ;

	}

	if( c < ' ' ){

		sprintf( buf, " ^%c ", c + 'A' - 1 );

	}else if( isspace(c)){

		sprintf( buf, " '%c'", c );

	}else if( ! isprint( c ))

		sprintf( buf, "\\%3o", c );

	 else   sprintf( buf, "  %c ", c );

	 return buf;

}

main( argc, argv ) char **argv;  {

	FILE *fp;

	if( argc == 1 ) process( stdin );

	else{   argv++; argc--;

		while( *argv ){

			printf( "----- FILE %s -----\n", *argv );

			if((fp = fopen( *argv, "r" )) == NULL ){

				printf( "Can not open\n" );

			}else{  process( fp ); fclose( fp );   }

			argv++; argc--;

		}

	}

	exit(0);

}

/* обработать файл с поинтером fp */

process( fp ) FILE *fp;

{       register i; int c; int n;

	/* зачистка счетчиков */

	for( i=0; i < 256; i++ ) cnt[i]  = 0L;

	for( i=0; i < 8  ; i++ ) bcnt[i] = 0;

	while( ( c=getc(fp)) != EOF ){

		 c &= 0377;

	     /* подсчитать букву */

		cnt[ c ] ++;

	     /* подсчет битов */

		for( i=0; i < 8; i++ )

			if( c & masks[i] )

				bcnt[ i ] ++;

	}

	/* выдача результатов в COL колонок */

#define COL 4

	printf( "\tASCII map\n" );

	for( n=i=0; i < 256; i++ ){

	     /* if( cnt[i] == 0l ) continue; */

	     printf( "%s  %5ld      |", pr(i), cnt[i] );

	     if( ++n == COL ){ n = 0; putchar('\n'); }

/* или       if((i % COL) == (COL-1)) putchar('\n');       */

	}

	printf( "\n\tBITS map\n" );

	for( i=7; i >=0 ; i-- ) printf( "%6d ", i );

	putchar( '\n' );

	for( i=7; i >=0 ; i-- )

		printf( "%6ld ", bcnt[i] );

	putchar( '\n' ); putchar( '\n' );

}

[Назад][Содержание][Вперед]

Используются технологии uCoz