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

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

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

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

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

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
const char* vowels = "eyuioa";
 
int programFail(const char* message)
{
    perror(message);
    return -1;
}
 
typedef struct
{
    char* buffer;
    size_t length, bufferedTextLength;
} Buffer;
 
void initBuffer(Buffer* buf)
{
    buf->length = 16;
    buf->buffer = malloc(sizeof(char)*buf->length);
    buf->bufferedTextLength = 0;
}
 
void writeEndBuffer(Buffer* buf, FILE* f)
{
    int i = 0;
    char c;
 
    for(;i < buf->length; ++i)
    {
        c = buf->buffer[i];
        if(strchr(vowels, c))
            fputc(c, f);
        fputc(c, f);
    }
}
 
void writeBuffer(Buffer* buf, FILE* f)
{
    size_t charCountWritten = 0, writeLimit = buf->length - buf->bufferedTextLength;
    int i = 0, offsetOfUnwrittenData, skip = 0;
    char c;
 
    for(;charCountWritten < writeLimit; ++i)
    {
        c = buf->buffer[i];
        if(strchr(vowels, c))
        {
            if (charCountWritten == (writeLimit - 1))
            {
                skip = 1;
                break;
            }
            fputc(c, f);
            ++charCountWritten;
        }
        fputc(c, f);
        ++charCountWritten;
    }
 
    for(offsetOfUnwrittenData = i; i < (buf->length - skip); ++i)
        buf->buffer[i - offsetOfUnwrittenData] = buf->buffer[i];
 
    buf->bufferedTextLength = buf->length - offsetOfUnwrittenData - skip;
}
 
int readBuffer(Buffer* buf, FILE* f)
{
    size_t newSize = buf->length;
    size_t bytesRead = 0, bytesToRead;
    long filePosition;
 
    if(buf->bufferedTextLength > buf->length/2)
    {
        newSize = buf->length * sizeof(char) * 2;
        buf->buffer = realloc(buf->buffer, newSize);
        buf->length = newSize;
    }
    filePosition = ftell(f);
    bytesToRead = newSize - buf->bufferedTextLength;
    bytesRead = fread(buf->buffer + buf->bufferedTextLength, sizeof(char), bytesToRead , f);
    fseek(f, filePosition, SEEK_SET);
 
    if(bytesRead < bytesToRead)
    {
        buf->length = bytesRead + buf->bufferedTextLength;
        buf->bufferedTextLength = 0;
        return 0;
    }
    return 1;
}
 
void  cleanupBuffer(Buffer* buf)
{
    free(buf->buffer);
}
 
int main(int argc, char** argv)
{
    Buffer buffer;
 
    if(argc < 2)
        return programFail("Missing file name command line argument");
 
    FILE* f = fopen(argv[1], "r+");
    if(f == NULL)
        return programFail("Unable to open the file");
 
    initBuffer(&buffer);
    while(1)
    {
        if(readBuffer(&buffer, f))
            writeBuffer(&buffer, f);
        else
        {
            writeEndBuffer(&buffer, f);
            break;
        }
 
    }
    fclose(f);
    cleanupBuffer(&buffer);
    return 0;
}

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

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

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

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


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

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

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