Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Витирання та перейменування файлів

У багатьох практичних задачах потрібно редагувати або частково змінювати вміст файлу. Здебільшого процес редагування файлу включає таку послідовність дій:

 

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, якщо файл відкрити не вдалось.



Читайте також:

  1. Видалення та відновлення папок та файлів
  2. Використання спеціальних файлів
  3. Збереження зовнішніх файлів у Портфель
  4. Копіювання та переміщення файлів і папок
  5. Можливості файлової системи NTFS по обмеженню доступу до файлів і каталогів
  6. Низькорівневе звертання до файлів
  7. Об‘єкти Windows. Папки. Документи. Додатки, Ярлики. Створення файлів. Дії визначені над об‘єктами Windows. Пошук об‘єктів. Властивості об‘єктів.
  8. Організація і представлення даних. Файл. Файлова система. Ім’я файлу, шлях до файлів. Властивості файлів.
  9. Організація файлів
  10. Перейменування аркуша
  11. Переміщення та копіювання папок та файлів




Переглядів: 987

<== попередня сторінка | наступна сторінка ==>
Керування буферизацією даних | Низькорівневе звертання до файлів

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.005 сек.