Удвоить все гласные буквы в текстовом файле - 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; }
Объяснение кода листинга программы
Код представляет собой программу, которая открывает указанный пользователем текстовый файл, считывает его содержимое построчно и удваивает все гласные буквы в каждой строке. Список элементов кода:
- Вектор
vowels
, содержащий гласные буквы. - Функция
programFail
, которая выводит сообщение об ошибке и возвращает код ошибки. - Структура
Buffer
, которая представляет буфер для чтения и записи данных. - Функция
initBuffer
, которая инициализирует буфер, выделяя память и устанавливая начальные значения его полей. - Функция
writeEndBuffer
, которая записывает в файл символ конца строки и двойные гласные буквы из буфера. - Функция
writeBuffer
, которая записывает в файл символы из буфера, удваивая гласные буквы. - Функция
readBuffer
, которая считывает данные из файла в буфер, увеличивая размер буфера при необходимости. - Функция
cleanupBuffer
, которая освобождает память, выделенную под буфер. - Функция
main
, которая является точкой входа в программу. Она открывает указанный пользователем файл, инициализирует буфер, считывает данные из файла в буфер, записывает удвоенные гласные буквы обратно в файл и закрывает его. Примечание: Номера элементов списка соответствуют порядковым номерам в исходном коде.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д