Skip to content

Instantly share code, notes, and snippets.

@goganchic
Created December 29, 2011 19:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save goganchic/1535731 to your computer and use it in GitHub Desktop.
Save goganchic/1535731 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <string.h>
#define SUCCESS_CODE 0
#define ERR_CODE 1
/*
* Функция разбора входных параметров
*
* аргументы:
*
* argc - количество параметров переданных при запуске программы
* argv - массив указателей на входные параметры
* search_string - указатель на указатель на строку поиска
* input_file - указатель на указатель на название файла для поиска
* output_file - указатель на указатель на название файла результатов
*
* в случае успеха возвращается SUCCESS_CODE
* в случае ошибки возвращается ERR_CODE
*/
int process_argv(int argc, char **argv, char **search_string, char **input_file, char **output_file)
{
// Проверяем количество входных параметров
// название программы + поисковая строка + название файла для поиска + название файла результатов
// итого - 4
if (argc == 4)
{
// Заполняем указатель на поисковую строку
*search_string = argv[1];
// Заполняем указатель на название файла для поиска
*input_file = argv[2];
// Заполняем указатель на название файла результатов
*output_file = argv[3];
// Возвращаем статус "операция успешно выполнена"
return SUCCESS_CODE;
}
else
{
// Выводим сообщение об ошибке
printf("Usage: finder string input_file output_file\n");
// Возвращаем статус "операция завершилась с ошибкой"
return ERR_CODE;
}
}
/*
* Функция поиска строки в файле
*
* аргументы:
*
* search_string - указатель на строку поиска
* input_file - указатель на название файла для поиска
* output_file - указатель на название файла результатов
*
* в случае успеха возвращается SUCCESS_CODE
* в случае ошибки возвращается ERR_CODE
*/
int find_string_in_file(char *search_string, char *input_file, char *output_file)
{
// Открываем файл для поиска на чтение ("r" - значит на чтение)
FILE *input_fdesc = fopen(input_file, "r");
// Проверяем, успешно ли открылся файл (если функция возвратила NULL - значит произошла ошибка)
if (input_fdesc == NULL)
{
// Выводим сообщение об ошибке
printf("Can't open file %s\n", input_file);
// Возвращаем статус "операция завершилась с ошибкой"
return ERR_CODE;
}
// Открываем файл результатов на запись ("w" - значит на запись)
FILE *output_fdesc = fopen(output_file, "w");
// Проверяем, успешно ли открылся файл (если функция возвратила NULL - значит произошла ошибка)
if (output_fdesc == NULL)
{
// Выводим сообщение об ошибке
printf("Can't open file %s\n", output_file);
// Закрываем файл для поиска
fclose(input_fdesc);
// Возвращаем статус "операция завершилась с ошибкой"
return ERR_CODE;
}
// Временная строка, куда мы будем считывать информацию из файла для поиска
char tmp_string[1024];
// Номер текущей строки
int line_number = 0;
// Построчно читаем файл для поиска пока не дойдем до конца
while (fgets(tmp_string, sizeof(tmp_string), input_fdesc))
{
// Увеличиваем номер текущей строки на единицу
line_number++;
// Ищем в текущей строке файла для поиска заданную строку
if (strstr(tmp_string, search_string) != NULL)
{
// В случае если строка найдена пытаемся вывести ее в файл результатов
if (fprintf(output_fdesc, "%d: %s", line_number, tmp_string) < 0)
{
// Если запись в файл результатов завершилась с ошибкой - завершаем цикл чтения и поиска
break;
}
}
}
// Закрываем файл для поиска
fclose(input_fdesc);
// Закрываем файл результатов
fclose(output_fdesc);
// Возвращаем статус "операция успешно выполнена"
return SUCCESS_CODE;
}
/*
* Главная функция программы
*
* аргументы:
*
* argc - количество параметров переданных при запуске программы
* argv - массив указателей на входные параметры
*
*/
int main(int argc, char **argv)
{
// Указатель на поисковую строку
char *search_string;
// Указатель на имя файла, где будет осуществляться поиск
char *input_file;
// Указатель на имя файла, куда будут записываться результаты
char *output_file;
// Смотрим входные параметры
if (process_argv(argc, argv, &search_string, &input_file, &output_file) == ERR_CODE)
{
// Возвращаем ошибку в случае ошибки разбора входных параметров
return ERR_CODE;
}
// Ищем указанную строку и выводим результаты в файл output_file
if (find_string_in_file(search_string, input_file, output_file) == ERR_CODE)
{
// Возвращаем ошибку в случае ошибки поиска
return ERR_CODE;
}
else
{
return SUCCESS_CODE;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment