Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
11 - Файлы.docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
311.88 Кб
Скачать

Вывод файла в обратном порядке

Используя функции произвольного доступа, напишем программу, которая выводит на экран файл в обратном порядке.

FILE* inFile = fopen("tutorial.cpp", "rb");

//Помещаем указатель в конец файла

fseek(inFile, 0, SEEK_END);

//Узнаем номер последней позиции, он равен размеру файла; ftell() возвращает номер текущей позиции

unsigned int size = ftell(inFile);

for (int i=1; i<size; i++) {

//Перемещаем указатель на –i позиций с конца

fseek(inFile, -i, SEEK_END);

//Считываем и записываем символ

putchar(fgetc(inFile));

}

fclose(inFile);

Пример нисходящей разработки

Напишем программу, которая переписывает содержимое одного файла в другой, дублируя все английские гласные буквы.

Разработаем алгоритм решения данной задачи. Начнем с высокоуровневых шагов:

  1. открыть исходный файл для чтения;

  2. открыть другой файл для записи;

  3. переписать символы из первого файла во второй, дублируя английские гласные буквы;

  4. закрыть оба файла.

Поскольку переписывать нужно все символы, то файлы следует открывать в бинарном режиме. Все шаги кроме третьего в данном алгоритме очевидны. Третий же шаг логично оформить в виде отдельной функции, куда в качестве аргументов передать файловые переменные, соответствующие открытым файлам. Программа примет следующий вид:

Функция dublicatVowels() пока не определена, поэтому для тестовых целей, чтобы данная программа запустилась, можно поставить так называемую заглушку для этой функции. Заглушка ничего относящегося к задаче делать не будет, а просто выведет сообщение о том, что там должно быть:

void dublicateVowels(FILE* in, FILE* out) {

printf("Здесь будет дублирование гласных");

}

После запуска программы мы убеждаемся в том, что в нашей программе готово все кроме функции dublicatVowels(). Займемся этой функцией, в которой необходимо пробежаться по всему файлу и выполнить следующие шаги:

  1. считать очередной символ из файла in;

  2. записать этот символ в файл out;

  3. если этот символ является английской гласной буквой, то записать его в файл out еще раз.

В данном алгоритме тривиальными являются все действия кроме проверки буквы на третьем шаге. Эта проверка должна ответить «Да» или «Нет» в зависимости от значения символа. Таким образом, эту проверку разумно вынести в отдельную функцию, которая будет принимать в качестве аргумента проверяемый символ, а возвращать значение логического типа true или false в зависимости от результата проверки. В итоге функция dublicateVowels() примет следующий вид:

В этой функции теперь неопределенна функция isEngVowel(), поэтому для нее можно поставить заглушку, возвращающую true всегда.

bool isEngVowel(char symbol) {

return true;

}

Очевидно, что теперь программа запустится, но будет дублировать все символы. Тем не менее, круг нашей разработки уже существенно сузился, поскольку осталось реализовать только функцию isEngVowel(). Разработаем ее алгоритм:

  1. создать строку с английскими гласными буквами;

  2. пробежаться в цикле по этой строке, возвращая true, если очередной символ равен аргументу функции;

  3. по окончании цикла, другими словами, если цикл не возвратил true, по ходу работы, то возвратить false.

В этом алгоритме уже все понятно, поэтому можно ее реализовать полностью.

bool isEngVowel(char symbol) {

char engVows[] = "aeiouyAEIOUY";

for (int i=0; i<strlen(engVows); i++) {

if (symbol==engVows[i]) {

return true;

}

}

return false;

}

КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Как записать один символ в файл?

  2. Как записать значение числовой переменной в файл?

  3. Как считать все содержимое файла?

  4. Какие функции для работы с файлами вам известны?

  5. Что произойдёт, если попытаться прочитать содержимое несуществующего файла?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]