Created
December 29, 2011 19:18
-
-
Save goganchic/1535731 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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