Найти символ, встречающийся в файле наибольшее число раз - 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