Удвоить все гласные буквы в текстовом файле - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Вся задача: 1) записать файл из текстом 2) прочитать из файла текст 3) удвоить все гласные буквы 4) записать обратно в файл

Решение задачи: «Удвоить все гласные буквы в текстовом файле»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. const char* vowels = "eyuioa";
  6.  
  7. int programFail(const char* message)
  8. {
  9.     perror(message);
  10.     return -1;
  11. }
  12.  
  13. typedef struct
  14. {
  15.     char* buffer;
  16.     size_t length, bufferedTextLength;
  17. } Buffer;
  18.  
  19. void initBuffer(Buffer* buf)
  20. {
  21.     buf->length = 16;
  22.     buf->buffer = malloc(sizeof(char)*buf->length);
  23.     buf->bufferedTextLength = 0;
  24. }
  25.  
  26. void writeEndBuffer(Buffer* buf, FILE* f)
  27. {
  28.     int i = 0;
  29.     char c;
  30.  
  31.     for(;i < buf->length; ++i)
  32.     {
  33.         c = buf->buffer[i];
  34.         if(strchr(vowels, c))
  35.             fputc(c, f);
  36.         fputc(c, f);
  37.     }
  38. }
  39.  
  40. void writeBuffer(Buffer* buf, FILE* f)
  41. {
  42.     size_t charCountWritten = 0, writeLimit = buf->length - buf->bufferedTextLength;
  43.     int i = 0, offsetOfUnwrittenData, skip = 0;
  44.     char c;
  45.  
  46.     for(;charCountWritten < writeLimit; ++i)
  47.     {
  48.         c = buf->buffer[i];
  49.         if(strchr(vowels, c))
  50.         {
  51.             if (charCountWritten == (writeLimit - 1))
  52.             {
  53.                 skip = 1;
  54.                 break;
  55.             }
  56.             fputc(c, f);
  57.             ++charCountWritten;
  58.         }
  59.         fputc(c, f);
  60.         ++charCountWritten;
  61.     }
  62.  
  63.     for(offsetOfUnwrittenData = i; i < (buf->length - skip); ++i)
  64.         buf->buffer[i - offsetOfUnwrittenData] = buf->buffer[i];
  65.  
  66.     buf->bufferedTextLength = buf->length - offsetOfUnwrittenData - skip;
  67. }
  68.  
  69. int readBuffer(Buffer* buf, FILE* f)
  70. {
  71.     size_t newSize = buf->length;
  72.     size_t bytesRead = 0, bytesToRead;
  73.     long filePosition;
  74.  
  75.     if(buf->bufferedTextLength > buf->length/2)
  76.     {
  77.         newSize = buf->length * sizeof(char) * 2;
  78.         buf->buffer = realloc(buf->buffer, newSize);
  79.         buf->length = newSize;
  80.     }
  81.     filePosition = ftell(f);
  82.     bytesToRead = newSize - buf->bufferedTextLength;
  83.     bytesRead = fread(buf->buffer + buf->bufferedTextLength, sizeof(char), bytesToRead , f);
  84.     fseek(f, filePosition, SEEK_SET);
  85.  
  86.     if(bytesRead < bytesToRead)
  87.     {
  88.         buf->length = bytesRead + buf->bufferedTextLength;
  89.         buf->bufferedTextLength = 0;
  90.         return 0;
  91.     }
  92.     return 1;
  93. }
  94.  
  95. void  cleanupBuffer(Buffer* buf)
  96. {
  97.     free(buf->buffer);
  98. }
  99.  
  100. int main(int argc, char** argv)
  101. {
  102.     Buffer buffer;
  103.  
  104.     if(argc < 2)
  105.         return programFail("Missing file name command line argument");
  106.  
  107.     FILE* f = fopen(argv[1], "r+");
  108.     if(f == NULL)
  109.         return programFail("Unable to open the file");
  110.  
  111.     initBuffer(&buffer);
  112.     while(1)
  113.     {
  114.         if(readBuffer(&buffer, f))
  115.             writeBuffer(&buffer, f);
  116.         else
  117.         {
  118.             writeEndBuffer(&buffer, f);
  119.             break;
  120.         }
  121.  
  122.     }
  123.     fclose(f);
  124.     cleanupBuffer(&buffer);
  125.     return 0;
  126. }

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

Код представляет собой программу, которая открывает указанный пользователем текстовый файл, считывает его содержимое построчно и удваивает все гласные буквы в каждой строке. Список элементов кода:

  1. Вектор vowels, содержащий гласные буквы.
  2. Функция programFail, которая выводит сообщение об ошибке и возвращает код ошибки.
  3. Структура Buffer, которая представляет буфер для чтения и записи данных.
  4. Функция initBuffer, которая инициализирует буфер, выделяя память и устанавливая начальные значения его полей.
  5. Функция writeEndBuffer, которая записывает в файл символ конца строки и двойные гласные буквы из буфера.
  6. Функция writeBuffer, которая записывает в файл символы из буфера, удваивая гласные буквы.
  7. Функция readBuffer, которая считывает данные из файла в буфер, увеличивая размер буфера при необходимости.
  8. Функция cleanupBuffer, которая освобождает память, выделенную под буфер.
  9. Функция main, которая является точкой входа в программу. Она открывает указанный пользователем файл, инициализирует буфер, считывает данные из файла в буфер, записывает удвоенные гласные буквы обратно в файл и закрывает его. Примечание: Номера элементов списка соответствуют порядковым номерам в исходном коде.

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


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

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

13   голосов , оценка 3.923 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы