
- •Тема 11. Файлы Зачем нужны файлы?
- •Запись информации в файл
- •Запись в файл значений переменных
- •Указание пути к файлу
- •Чтение информации из файла
- •Чтение файла целиком
- •Режимы открытия файла в Си
- •Бинарный и текстовый режимы
- •Произвольный доступ к файлу
- •Вывод файла в обратном порядке
- •Пример нисходящей разработки
Вывод файла в обратном порядке
Используя функции произвольного доступа, напишем программу, которая выводит на экран файл в обратном порядке.
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);
Пример нисходящей разработки
Напишем программу, которая переписывает содержимое одного файла в другой, дублируя все английские гласные буквы.
Разработаем алгоритм решения данной задачи. Начнем с высокоуровневых шагов:
открыть исходный файл для чтения;
открыть другой файл для записи;
переписать символы из первого файла во второй, дублируя английские гласные буквы;
закрыть оба файла.
Поскольку переписывать нужно все символы, то файлы следует открывать в бинарном режиме. Все шаги кроме третьего в данном алгоритме очевидны. Третий же шаг логично оформить в виде отдельной функции, куда в качестве аргументов передать файловые переменные, соответствующие открытым файлам. Программа примет следующий вид:
Функция dublicatVowels() пока не определена, поэтому для тестовых целей, чтобы данная программа запустилась, можно поставить так называемую заглушку для этой функции. Заглушка ничего относящегося к задаче делать не будет, а просто выведет сообщение о том, что там должно быть:
void dublicateVowels(FILE* in, FILE* out) {
printf("Здесь будет дублирование гласных");
}
После запуска программы мы убеждаемся в том, что в нашей программе готово все кроме функции dublicatVowels(). Займемся этой функцией, в которой необходимо пробежаться по всему файлу и выполнить следующие шаги:
считать очередной символ из файла in;
записать этот символ в файл out;
если этот символ является английской гласной буквой, то записать его в файл out еще раз.
В данном алгоритме тривиальными являются все действия кроме проверки буквы на третьем шаге. Эта проверка должна ответить «Да» или «Нет» в зависимости от значения символа. Таким образом, эту проверку разумно вынести в отдельную функцию, которая будет принимать в качестве аргумента проверяемый символ, а возвращать значение логического типа true или false в зависимости от результата проверки. В итоге функция dublicateVowels() примет следующий вид:
В этой функции теперь неопределенна функция isEngVowel(), поэтому для нее можно поставить заглушку, возвращающую true всегда.
bool isEngVowel(char symbol) {
return true;
}
Очевидно, что теперь программа запустится, но будет дублировать все символы. Тем не менее, круг нашей разработки уже существенно сузился, поскольку осталось реализовать только функцию isEngVowel(). Разработаем ее алгоритм:
создать строку с английскими гласными буквами;
пробежаться в цикле по этой строке, возвращая true, если очередной символ равен аргументу функции;
по окончании цикла, другими словами, если цикл не возвратил 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;
}
КОНТРОЛЬНЫЕ ВОПРОСЫ
Как записать один символ в файл?
Как записать значение числовой переменной в файл?
Как считать все содержимое файла?
Какие функции для работы с файлами вам известны?
Что произойдёт, если попытаться прочитать содержимое несуществующего файла?