По текстовому файлу составить статистику частоты появления символов - C (СИ)
Формулировка задачи:
По текстовому файлу составить статистику частоты появления символов и записать в файл в порядке убывания.
Я написал так что бы каждый символ записывался в массив как только встретиться и выводится на экран сколько раз встретился, но потом обнаружил что записывает так же переход на новую строку и сдвиг каретки (вроде). мне сказали что нужно что бы строка читалась до /n, я записал так (c == "\n" || c == -52) но не помогло, подскажите как исправить чтобы выводил и записывал только символы, без остального. Пожалуйста
#include <stdio.h>
void main(void)
{
int s[256][2], i, j, yes;
char line[1024];
FILE *f, *ff;
f = fopen("C:\\Users\\Nikita\\Desktop\\source.txt", "rt");
if (f == NULL)
{
printf("Opening error");
getch();
return;
}
ff = fopen("C:\\Users\\Nikita\\Desktop\\dest.txt", "wt");
while (!feof(f))
{
fgets(line, 1024, f);
for (i = 0; i < 1024; i++)
{
char c = line[i];
if (c == "\n" || c == -52)
break;
for (j = 0; j < 256; j++)
{
if (((char)s[j][0]) == c) {
s[j][1]++;
printf("%3i - %c\n", c, ((int)c));
break;
}
if (((char)s[j][0]) == ((char)-52))
{
s[j][0] = c;
s[j][1] = 1;
printf("%3i - %c\n", c, ((int)c));
break;
}
}
}
}
fclose(f);
yes = 0;
for (i = 0; i < 256; i++) {
for (j = 0; j < 256; j++) {
if (((char)s[j + 1][0]) == ((char)-52)) {
break;
}
if (s[j][1] < s[j + 1][1])
{
int temp[2] = { s[j][0], s[j][1] };
s[j][0] = s[j + 1][0];
s[j][1] = s[j + 1][1];
s[j + 1][0] = temp[0];
s[j + 1][1] = temp[1];
yes = 1;
}
}
if (yes == 0)
{
break;
}
yes = 0;
}
for (i = 0; i < 256; i++)
{
if (s[i][0] == -858993460)
break;
printf("'%c' - %i times\n", s[i][0], s[i][1]);
fprintf(ff, "'%c' - %i times\n", s[i][0], s[i][1]);
}
fclose(ff);
getch();
}Решение задачи: «По текстовому файлу составить статистику частоты появления символов»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define N 96 //количество символов в таблице ANSII начиная с пробела
int main()
{
FILE *f1;
if(!(f1 = fopen("file1.txt", "r"))){
fprintf(stderr, "Error opening file");
exit(1);
}
int i, c, A[N][2], x = 32;
for(i = 0; i < N; ++i, ++x){//создаем двумерный массив,в первом столбце символы ANSII начиная с 32-го,т.е. с пробела
A[i][0] = x; //во второй будем заносить количество появлений в тексте данного символа
A[i][1] = 0;
}
while((c = fgetc(f1)) != EOF){
for(i = 0; i < N; ++i){
if(c == A[i][0])
A[i][1]++;
}
}
for(i = 0; i < N - 1; ++i)//сортируем на убывание
for(int j = N - 2; j >= i; --j)
if(A[j][1] < A[j + 1][1]){
for(int m = 1; m >= 0; --m){
c = A[j][m];
A[j][m] = A[j + 1][m];
A[j + 1][m] = c;
}
}
for(i = 0; i < N; ++i)
if(A[i][1] != 0)
printf("%c %d\n", A[i][0], A[i][1]);
fclose(f1);
return 0;
}
Объяснение кода листинга программы
- Подключаются необходимые библиотеки
- Определяется количество символов в таблице ANSII
- Открывается файл для чтения
- Создается двумерный массив для хранения статистики
- Заполняются оба столбца массива
- В цикле считываются символы из файла
- По каждому символу обновляется соответствующее поле во втором столбце массива
- Два вложенных цикла используются для сортировки массива по убыванию количества появлений символа
- Выводится отсортированный список символов и их частоты появления
- Файл закрывается
- Программа завершается