Найти символ, встречающийся в файле наибольшее число раз - C (СИ)

  1. Есть вот такая задачка: Дан текстовый файл in. Найти символ, встречающийся в файле наибольшее число раз. Если таких символов несколько, найти их все. Переписать эти символы в другой файл out. Я попытался решить, но не совсем знаю как, заранее благодарен за все, что вы поправите. До алгоритма я догадался, а реализовать оказалось сложнее, помогите нубу и если не сложно исправьте код.C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #include <stdio.h> #include <locale.h> #include <conio.h> #include <string.h> void main () { setlocale (LC_ALL, "Russian"); char znacheniya[256]; int max=0; FILE *in; FILE *out; in=fopen ("RGR/in.txt", "r"); out=fopen ("RGR/out.txt", "w"); if(in == NULL)     {         printf("Файл не открывается ");         return 0;     }     for (int i=1; i<257; i++)                           {             while (strstr(in;\xi))         //тут не все ладно, помоему strstr не работает просто с файлом, к тому же я не уверен в том, что правильно записал код символа, который будет изменяться с течением цикла             {                     znacheniya[i]++;             }         } for (int i=1; i<257; i++)     {         if (znacheniya[i]>max)             max=znacheniya[i];       //нашел максимальное кол-во повторений     } for (int i=1; i<257; i++)     {         if (znacheniya[i]==max)         {             fprintf (out,"\xi");                  // та же проблема с кодом символа. Здесь пытался найти те символы, что повторяли max кол-во раз и сразу записать их в файл.         }     } if (fclose(out))     printf("Ошибка при закрытии файла.\n");              // правильно ли я файл закрыл? getch();


textual

Код к задаче: «Найти символ, встречающийся в файле наибольшее число раз - C (СИ)»

#include <stdio.h>
#include <stdlib.h>
 
//Дан текстовый файл in. Найти символ, встречающийся 
//в файле наибольшее число раз. Если таких символов несколько, 
//найти их все. Переписать эти символы в другой файл out.
 
void help(const char *);
int found_copy_sym(FILE *, FILE *, char );
 
int main(int argc, char const **argv){  
  if (argc!=4){
    help(argv[0]);    
  } 
  FILE *in = NULL, *out = NULL;
  
  if (NULL==(in=fopen(argv[2], "rb"))){
    printf("[error] wrong open for reading %s file. abort\n", argv[3]);
    exit(3);
  }
  if (NULL==(out=fopen(argv[3], "wb"))){
    printf("[error] wrong open for writing %s file. abort\n", argv[4]);
    exit(4);
  }
  int count = found_copy_sym(in, out, *argv[1]);     
  fclose(in);
  fclose(out);    
  if (count){
    printf("Found: %d sym: %s\n", count, argv[1]);
  } else {
    printf("Not found sym: %s\n", argv[1]);
    remove(argv[3]);
  }    
  return 0;
}
 
void help(const char *progname){
  printf("usage: %s <sym_value_for_find_in_file:)> [infile] [outfile]\n", progname);
  exit(0);
}
 
int found_copy_sym(FILE *in, FILE *out, char sym){
  int count=0;
  while(!feof(in)){
    char tmp;    
    fread(&tmp, sizeof(tmp), 1, in);
    if (tmp==sym){ 
      fprintf(out, "%c", sym);    
      count++;
    }
  } 
  if (!count) return 0;
  return count;    
}

СДЕЛАЙТЕ РЕПОСТ

15   голосов, оценка 4.267 из 5



Похожие ответы
  1. Дана строка. Найти символ в строке, встречающийся наибольшее число раз. Заранее спасибо!

  1. Помогите написать функцию char* findChar(const char *str, char c); которая ищет в строке str указанный символ c и возвращает указатель на его первое вхождение. В случае если символ не найден, должен быть возвращён указатель на конец строки. Функция не должна выходить за пределы строки

  1. Помогите написать программы на языке С,с помощью scanf,printf и т.д. 1)Дан текст, произвольной длины. Определить символ, встречающийся в тексте с максимальной частотой. 2)Дана матрица размером n x m. Найти наибольший положительный и наименьший отрицательный элементы матрицы.

  1. Задача программы - найти символ, встречающийся в файле(дан файл F) наибольшее число раз. Если таких символов несколько, найти их все. Переписать эти символы в другой файл G.

  1. Дан текстовый файл. Преобразовать его, удалив каждый символ ‘*’ и повторив каждый символ, отличный от ‘*’.

  1. C1 2 while (getchar())     printf("Итерация цикла.\n");Если ввести 1-ин символ, то итерация цикла выполняется сразу два раза подряд. Если 2-а символа - 3-и раза подряд. Если 3-а символа - 4-е раза подряд. ... итд. Почему так происходит?

  1. Вот маленькая, но настойчивая программка, которая не успокаивается, пока не скажите "да" (y):C1 2 3 4 5 6 7 8 9 10 11 #include   int main() {     char ans;     do {         printf("Enter answer: \n");         scanf("%c", &ans);     } while (ans != 'y');     return 0; }Вопрос состоит в том, что строчка Enter answer выводится дважды. Я так понимаю, это связано с тем, что scanf рассматривает нажатие клавиши enter как дополнительный символ, который не равен 'y'. Но как сделать правильно? (Если использовать потоковый ввод, с cin и cout, такой проблемы не возникает.)

  1. Парни помогите, я никак не могу понять, и мне никто не может нормально объяснить! Сколько уже всего пересмотрел не понимаю - уже начинается паника. Мне нужно следующее: - если приходит символ, то запустить блок создания массива в два столбика и n-ое колличество строк (пришёл 5-ый символ, значит нужно в массив добавть пятую строчку) (пришёл 6-ой символ, значит к тому массиву из 5ти строк, добавить шестую!) я пытаюсь уже (4ый день) реализовать эту фигню и не могу, и никто видимо не может! скоро повешусь к чертям... как я понял алгоритм должен быть такой: 1 - сначала мы выделили память под указатель 2 - потом мы выделили память под строчку 3 - сформируем строчку 4 - адрес сформированной строки запишем в указатель помогите, мне срочно надо!