Вычислить общее количество строк в файлах с расширениями "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. Если аргумента нет, то обрабатывается текущая директория. - В конце программы выводится общее количество строк во всех обработанных файлах.