МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів
Контакти
Тлумачний словник Авто Автоматизація Архітектура Астрономія Аудит Біологія Будівництво Бухгалтерія Винахідництво Виробництво Військова справа Генетика Географія Геологія Господарство Держава Дім Екологія Економетрика Економіка Електроніка Журналістика та ЗМІ Зв'язок Іноземні мови Інформатика Історія Комп'ютери Креслення Кулінарія Культура Лексикологія Література Логіка Маркетинг Математика Машинобудування Медицина Менеджмент Метали і Зварювання Механіка Мистецтво Музика Населення Освіта Охорона безпеки життя Охорона Праці Педагогіка Політика Право Програмування Промисловість Психологія Радіо Регилия Соціологія Спорт Стандартизація Технології Торгівля Туризм Фізика Фізіологія Філософія Фінанси Хімія Юриспунденкция |
|
|||||||
Витирання та перейменування файлівУ багатьох практичних задачах потрібно редагувати або частково змінювати вміст файлу. Здебільшого процес редагування файлу включає таку послідовність дій:
1) відкрити для читання файл, що має бути змінений; 2) створити новий тимчасовий файл для запису; 3) у новий файл переписати вміст базового файлу, виконавши потрібні зміни та доповнивши його необхідною інформацією; 4) закрити обидва файли; 5) витерти файл, який редагувався; 6) надати новоствореному файлу ім'я базового.
Конкретні реалізації задач редагування вмісту файлу можуть мати свої особливості. Наприклад, базовий файл можна не витирати, а зберігати зі зміненим іменем чи розширенням (загальноприйнятою є заміна розширення на *.bас - bac-версія). Деколи після завершення роботи витирають тимчасовий файл або переписують його в інший каталог тощо.
Для програмування кроків 5 та 6 наведеної схеми редагування файлів доцільно використовувати бібліотечні функції витирання та перейменування файлів, оголошені разом з іншими функціями файлового обміну в <stdio. h>.
Функція int remove (char * fname);
витирає файл з іменем fname (правила запису імені файлу такі ж, як і для функції fopen()). За умови успішного витирання файлу remove () повертає нуль, а в разі невдачі - ненульове значення.
У Borland C remove () організовано як макрос, який викликає функцію unlink (), що власне реалізує процес витирання файла:
int unlink (char* fname);
Функція unlink () не підтримується стандартом мови С.
Зміну імені файла виконує функція int rename (char* oldfname, char* newfname);
У разі успішного виконання функція повертає нуль, а файлу, ім'я якого задається параметром oldfname, присвоюється нове ім'я - newfname.
У програмах, що реалізуються в середовищі Borland C, перейменування файлів виконується за правилами MS DOS. Важливо, щоб на момент перейменування у каталозі не було іншого файлу з іменем newfname, бо тоді ім'я файлу не змінюється, а функція повертає значення, що не дорівнює нулю. Тому в процесі редагування файлу спочатку витирають або перейменовують базовий файл, а вже потім його ім'я надають новоствореному.
Всі функції витирання та перейменування файлів працюють тільки зі закритими файлами.
Створення нових і тимчасових файлів пов'язане з необхідністю перевірки, чи існує інший файл з іменем, яке повинен отримати новостворений файл. Якщо такий контроль не здійснювати, то можна випадково затерти наявний однойменний файл.
Альтернативним вирішенням даної проблеми є використання функції, що генерує ім'я файлу, яке буде унікальним для поточного активного каталогу: char* tmpnam (char* fname);
Єдиним параметром tmpnam () є вказівник на масив символів, в який буде записано згенероване ім'я. Розмірність масиву fname повинна бути не меншою за значення макроконстанти L_tmpnam (13 символів). Якщо замість fname підставити значення NULL, то згенероване функцією ім'я буде записане у спеціальну внутрішню змінну, адресу якої поверне функція.
У Borland C унікальні імена створюються за таким правилом: якщо в активному каталозі відсутній файл з іменем tmpl.$$$, то це буде першим згенерованим ім'ям, інакше послідовно перевіряються імена tmp2.$$$, tmp3.$$$ і т.д. Кожен виклик функції tmpnam () у програмі генерує наступне за порядковим номером ім'я файлу.
У разі успішного виконання tmpnam () повертає адресу першого символу зге-нерованого імені файлу. Якщо ж унікальне ім'я згенерувати не вдалось, то функція повертає NULL.
Проілюструємо застосування описаних вище функцій прикладом програми, яка виконує редагування вмісту файлу. Програма реалізує таку задачу: в заданому текстовому файлі треба доповнити кожну цифру словесним найменуванням (тобто відповідним чисельником), записаним у круглих дужках. Відредагованому файлу треба надати ім'я, яке мав базовий файл. /**************************************************************************/ /* Доповнення файлу найменуваннями цифрових символів */ /**************************************************************************/ #include <stdio.h> #include <ctype.h> int main (void) { FILE * fold, *ftmp; /* вказівники базового танового файлів */ char foldname[13], ftmpname[13]; int symb; char * number[] = { "нуль", "один", "два", "три", "чотири", "п'ять", "шість", "сім", "вісім", "дев'ять"}; printf ("Файл для заміни - "); gets(foldname); if ( (fold= fopen(foldname,"rt"))-== NULL ) { printf ("Помилка в імені файла - %s \n", foldname); return 0; } tmpnam (f tmpname); /* генерування унікального імені файла */ if ((ftmp = fopen(ftmpname,"wt"))== NULL ) { printf ("He можна створити новий файл"); return 0; } while ((symb = getc(fold) ) != EOF ) { /* цикл редагування файла */ putc(symb, ftmp); if ( isdigit(symb) ) /* якщо зустрілась цифра, то виводиться */ fprintf (ftmp, "(%s)", number[symb-'0']); /* її назва */ } fcloseall(); /* закриття файлів */ if (remove (foldname )== 0) { /* витирання початкового файла */ rename (f tmpname, foldname); /* перейменування нового файла */ printf("Файл %s відредаговано.\n", foldname); } else printf("Створено новий файл - %s \n", ftmpname); return 0; }
Файл, призначений для тимчасового використання, можна створити за допомогою функції
FILE * tmpfile (void);
Вона відкриває тимчасовий файл у режимі бінарного читання/запису ("w+b"). Файл отримує унікальне ім'я згідно з tmpnam (). Треба пам'ятати, що створюється тимчасовий файл - він буде автоматично витертий після закриття чи завершення роботи програми.
Функція tmpfile () повертає вказівник на потік, пов'язаний зі створеним тимчасовим файлом, або NULL, якщо файл відкрити не вдалось. Читайте також:
|
||||||||
|