Вычислить общее количество строк в файлах с расширениями "pas" и "cpp" - C (СИ) (78854)
Формулировка задачи:
Составить программу, которая для заданного начального каталогов файловой системы вычисляет общее количество строк в файлах с расширениями "pas" и "cpp" которые находятся внутри этого каталога и его подкаталогов.
каталог, цитаты и прочее можно делать самому - мне её работу нужно будет демонстрировать
ПОМОГИТЕ ПЛЗ!!!!!!
Решение задачи: «Вычислить общее количество строк в файлах с расширениями "pas" и "cpp"»
textual
Листинг программы
#include <sys/types.h> #include <dirent.h> #include <string.h> #include <stdlib.h> #include <stdio.h> int EndsWith(const char *string, const char *substring) { int string_length = strlen(string); int substring_length = strlen(substring); if (string_length < substring_length) return 0; const char *string_symbol = string + string_length - substring_length; return ((strcmp(string_symbol, substring) == 0) ? 1 : 0); } void ProcessFile(const char *file_name) { if (EndsWith(file_name, ".c") || EndsWith(file_name, ".cc") || EndsWith(file_name, ".cpp") || EndsWith(file_name, ".pas")) { FILE *infile = fopen(file_name, "r"); if (infile != NULL) { int k_buffer_size = 4096; char *buffer = (char*)malloc(k_buffer_size); int lines_count = 0; while (!feof(infile)) if (fgets(buffer, k_buffer_size, infile)) ++lines_count; free(buffer); fclose(infile); printf("%s has %d line%s\n", file_name, lines_count, (lines_count > 1) ? "s" : ""); } else { fprintf(stderr, "Error reading file %s.\n", file_name); } } } void ProcessFolder(const char *folder_name) { DIR *directory; struct dirent *directory_entry; if ((directory = opendir(folder_name)) == NULL) { fprintf(stderr, "Error opening %s.\n", folder_name); return; } while ((directory_entry = readdir(directory)) != NULL) { if (strcmp(directory_entry->d_name, ".") != 0 && strcmp(directory_entry->d_name, "..") != 0) { char *subentry = (char*)malloc(strlen(folder_name) + strlen(directory_entry->d_name) + 2); strcpy(subentry, folder_name); strcat(subentry, "/"); strcat(subentry, directory_entry->d_name); if (directory_entry->d_type & DT_DIR) ProcessFolder(subentry); else if (directory_entry->d_type & DT_REG) ProcessFile(subentry); free(subentry); } } closedir(directory); } int main(int argc, char *argv[]) { if (argc == 2) ProcessFolder(argv[1]); else ProcessFolder("."); }
Объяснение кода листинга программы
- Программа подсчитывает количество строк в файлах с расширениями
pas
иcpp
. - В начале кода определена функция
EndsWith
, которая проверяет, заканчивается ли строка на указанную подстроку. - Далее определена функция
ProcessFile
, которая открывает указанный файл, считает количество строк в нем и выводит результат на экран. - Затем определена функция
ProcessFolder
, которая открывает указанную папку, перебирает все файлы в ней и вызывает функциюProcessFile
для каждого файла. - В основной функции
main
программа проверяет наличие аргумента при запуске и передает его в функциюProcessFolder
. Если аргумента нет, то обрабатывается текущая директория. - В конце программы выводится общее количество строк во всех обработанных файлах.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д