Найти символ, встречающийся в файле наибольшее число раз - 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; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы для работы с файлами и стандартными функциями
- Описывается функция помощи, которая выводит сообщение об ошибке и завершает программу
- В функции main проверяется корректность входных данных. Если входные данные не соответствуют ожидаемым, вызывается функция помощи и программа завершается
- Открываются входной и выходной файлы. Если открытие файлов не удалось, выводится сообщение об ошибке и программа завершается
- В функции found_copy_sym определяется количество вхождений искомого символа в файл. Функция считывает файл посимвольно и подсчитывает количество совпадений
- Если в функции found_copy_sym не было найдено ни одного совпадения, функция возвращает 0. В противном случае возвращается количество совпадений
- Во время выполнения функции main закрываются открытые файлы
- Выводится сообщение о результате выполнения программы: было ли найдено искомое количество вхождений символа или нет
- Если в функции main было найдено хотя бы одно вхождение искомого символа, выводится количество вхождений и сам символ
- Если в функции main не было найдено ни одного вхождения искомого символа, выводится соответствующее сообщение и удаляется файл out
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д