Вычислить общее количество строк в файлах с расширениями "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(".");
}

Объяснение кода листинга программы

  1. Программа подсчитывает количество строк в файлах с расширениями pas и cpp.
  2. В начале кода определена функция EndsWith, которая проверяет, заканчивается ли строка на указанную подстроку.
  3. Далее определена функция ProcessFile, которая открывает указанный файл, считает количество строк в нем и выводит результат на экран.
  4. Затем определена функция ProcessFolder, которая открывает указанную папку, перебирает все файлы в ней и вызывает функцию ProcessFile для каждого файла.
  5. В основной функции main программа проверяет наличие аргумента при запуске и передает его в функцию ProcessFolder. Если аргумента нет, то обрабатывается текущая директория.
  6. В конце программы выводится общее количество строк во всех обработанных файлах.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы