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

Узнай цену своей работы

Формулировка задачи:

Есть вот такая задачка: Дан текстовый файл in. Найти символ, встречающийся в файле наибольшее число раз. Если таких символов несколько, найти их все. Переписать эти символы в другой файл out. Я попытался решить, но не совсем знаю как, заранее благодарен за все, что вы поправите. До алгоритма я догадался, а реализовать оказалось сложнее, помогите нубу и если не сложно исправьте код.
#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
Листинг программы
#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;    
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы для работы с файлами и стандартными функциями
  2. Описывается функция помощи, которая выводит сообщение об ошибке и завершает программу
  3. В функции main проверяется корректность входных данных. Если входные данные не соответствуют ожидаемым, вызывается функция помощи и программа завершается
  4. Открываются входной и выходной файлы. Если открытие файлов не удалось, выводится сообщение об ошибке и программа завершается
  5. В функции found_copy_sym определяется количество вхождений искомого символа в файл. Функция считывает файл посимвольно и подсчитывает количество совпадений
  6. Если в функции found_copy_sym не было найдено ни одного совпадения, функция возвращает 0. В противном случае возвращается количество совпадений
  7. Во время выполнения функции main закрываются открытые файлы
  8. Выводится сообщение о результате выполнения программы: было ли найдено искомое количество вхождений символа или нет
  9. Если в функции main было найдено хотя бы одно вхождение искомого символа, выводится количество вхождений и сам символ
  10. Если в функции main не было найдено ни одного вхождения искомого символа, выводится соответствующее сообщение и удаляется файл out

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.267 из 5
Похожие ответы