) p>
else p>
( p>
cout <<
"File not found!" <<
endl; p>
) p>
fclose (file); p>
) p>
Опис функцій роботи з файломі знаходяться в
бібліотеці stdio.h p>
Спочатку треба створити покажчик на змінну типу FILE
(FILE * file;). P>
Відкриття файлу здійснюється викликом функції fopen (
file = fopen (file_name, "w");) p>
Перший параметр цієї функції - ім'я файлу, другий --
вказує в якому режимі повинен бути відкритий файл. "w" - відкрити для
запису, "r" - відкрити для читання, "a" - доповнення файлу (
це найбільш використовувані режими, хоча є й інші). Запис і зчитування
даних з файлу здійснюється наступними функціями: fputc, fputs, fgetc,
fgets, fprintf, fscanf (опис цих функцій дивіться в stdio.h). p>
Закриття файлу здійснюється викликом функції fclose (
fclose (file);).
p>
Робота з файлами з
допомогою MFC (класи CFile, CStdioFile, ...) і стандартний клас MFC
CFileDialog. P>
Клас CFile p>
Клас CMemFile p>
Клас CStdioFile p>
Приклади запису та читання з файлу p>
До бібліотеки MFC включено кілька класів для
забезпечення роботи з файлами. Розглянуті нижче класи успадковуються від
базового класу CFile. p>
Клас CF
ile p>
Клас CFile призначений для забезпечення роботи з
файлами. Він дозволяє спростити використання файлів, представляючи фото як
об'єкт, який можна створити, читати, записувати і т.д. p>
Щоб отримати доступ до файлу, спочатку треба створити
об'єкт класу CFile. Конструктор класу дозволяє відразу після створення такого
об'єкта відкрити файл. Але можна відкрити файл і пізніше, скориставшись методом
Open. P>
Відкриття та створення файлів p>
Після створення об'єкта класу CFile можна відкрити
файл, викликавши метод Open. Методу треба вказати шлях до відкритих файлів та режим
його використання. Прототип методу Open має такий вигляд: p>
virtual BOOL Open (LPCTSTR lpszFileName, p>
UINT nOpenFlags, CFileException * pError = NULL); p>
Як параметр lpszFileName треба вказати ім'я
що відкривається файлу. Можна вказати тільки ім'я файлу або повне ім'я файлу,
що включає повний шлях до нього. p>
Другий параметр nOpenFlags визначає дію,
що виконується методом Open з файлом, а також атрибути файлу. Нижче представлені
деякі возможеие значення параметра nOpenFlags: p>
CFile:: modeCreate - Створюється новий файл. Якщо
вказаний файл існує, то його вміст стирається і довжина файлу
встановлюється рівною нулю. p>
CFile:: modeNoTruncate - Цей файл призначений для
використання спільно з файлом CFile:: modeCreate. Якщо створюється вже
існуючий файл, то його вміст не буде видалено. p>
CFile:: modeRead - Файл відкривається тільки для читання. p>
CFile:: modeReadWrite - Файл відкривається для запису і
для читання. p>
CFile:: modeWrite - Файл відкривається тільки для запису.
p>
CFile:: typeText - Використовується класами, породженими
від класу CFile, наприклад CStdioFile, для роботи з файлами у текстовому режимі.
Текстовий режим забезпечує перетворення комбінації символу повернення каретки
і символу переведення рядка. p>
CFile:: Binary - Використовується класами, породженими від
класу CFile, наприклад CStdioFile, для роботи з файлами в двійковому режимі. p>
необов'язковий параметр pError, який є дороговказом
на об'єкт класу CFileException, використовується тільки в тому випадку, якщо
виконання операції з файлом викличе помилку. При цьому в об'єкт, що указується
pError, буде записана додаткова інформація. p>
Метод Open повертає нульове значення, якщо файл
відкритий і нуль у разі помилки. Помилка при відкритті файлу може трапитися,
наприклад, якщо методу Open зазначено для читання неіснуючий файл. p>
Ідентифікатор відкритого файлу p>
До складу класу CFile входить елемент даних m_hFile
типу UINT. У ньому зберігається ідентифікатор відкритого файлу. Якщо об'єкт класу
CFile вже створений, але файл ще не відкрито, то у змінній m_hFile записана
константа hFileNull. p>
Зазвичай ідентифікатор відкритого файлу безпосередньо
не використовується. Методи класу CFile дозволяють виконувати практично будь-які
операції з файлами і не вимагають вказувати ідентифікатор файлу. Так як m_hFile
є елементом класу, то реалізація його методів завжди має вільний
доступ до нього. p>
Закриття файлів p>
Після завершення роботи з файлом, його треба закрити.
Клас CFile має для цього спеціальний метод Close. Потрібно відмітити, що якщо
був створений об'єкт класу CFile і відкритий файл, а потім об'єкт віддаляється, то
пов'язаний з ним файл закривається автоматично за допомогою деструктора. p>
Читання та запис файлів p>
Для доступу до файлів призначено кілька методів
класу CFile: Read, ReadHuge, Write, WriteHuge, Flush. Методи Read і ReadHuge
призначені для читання даних з заздалегідь відкритого файлу. У
32-розрядних операційних системах обидва методи можуть одночасно вважати з
файлу більше 65535 байт. Специфікація ReadHuge вважається застарілою і залишена
тільки для сумісності з 16-розрядними операційними системами. p>
Дані, прочитані з файлу, записуються в буфер
lpBuf. Параметр nCount визначає кількість байт, яке треба вважати з
файлу. Фактично з файлу може бути вважало менше байт, ніж запрошено
параметром nCount. Це відбувається, якщо під час читання досягнуто кінець файлу.
Методи повертають кількість байт, прочитані з файлу. P>
Для запису в файл призначені методи Write і
WriteHuge. У 32-розрядних операційних системах обидва методи можуть одночасно
записувати в файл більше 65535 байт. Методи записує у відкритий файл nCount
байт з буфера lpBuf. У разі виникнення помилки запису, наприклад переповнення
диска, методи викликає обробку виключення. p>
Метод Flush p>
Коли використовується метод Write або WriteHuge для
запису даних на диск, вони деякий час можуть перебувати в тимчасовому
буфері. Щоб переконатися, що необхідні зміни внесені у файл на диску,
потрібно скористатися методом Flush. p>
Операції з файлами p>
До складу класу входять методи, що дозволяють виконувати
над файлами різні операції, наприклад копіювання, перейменування, видалення,
зміна атрибутів. p>
Для зміни імені файлу клас CFile включає
статичний метод Rename, що виконує функції цієї команди. Метод не можна
використовувати для перейменування каталогів. У разі виникнення помилки метод
викликає виключення. p>
Для видалення файлів у класі CFile включений статичний
метод Remove, що дозволяє видалити вказаний файл. Цей метод не дозволяє
видаляти каталоги. Якщо видалити файл неможливо, то метод викликає виключення. P>
Щоб визначити дату і час створення файлу, його
довжину і атрибути, призначений статичний метод GetStatus. Існує два різновиди
методу - перша визначений як віртуальний, а другий - як статичний метод. p>
Віртуальна версія методу GetStatus визначає
стан відкритого файлу, пов'язаного з даним об'єктом класу CFile. Цей
метод викликається тільки тоді, коли об'єкт класу CFile створений і файл відкритий. p>
Статична версія методу GetStatus дозволяє
визначити характеристики файлу, не пов'язаного з об'єктом класу CFile. Щоб
скористатися цим методом, не обов'язково попередньо відкривати файл. p>
Блокування p>
До складу класу включені методи LockRange і
UnlockRange, що дозволяють заблокувати один або кілька фрагментів даних
файлу для доступу з інших процесів. Якщо програма намагається повторно
блокувати дані, вже заблоковані раніше цим або іншу систему
викликається виняток. Блокування являє собою один з механізмів,
дозволяють декільком додаткам або процесів одночасно працювати з одним
файлом, не заважаючи одне одному. p>
Встановити блокування можна за допомогою методу
LockRange. Щоб зняти встановлені блокування, треба скористатися методом
UnlockRange. Якщо в одному файлі встановлені кілька блокувань, то кожна з
них повинна зніматися окремим викликом методу UnlockRange. p>
Позиціонування p>
Щоб перемістити покажчик поточної позиції файлу в нове
положення, можна скористатися одним з таких методів класу CFile --
Seek, SeekToBegin, SeekToEnd. До складу класу CFile також входять методи,
що дозволяють встановити та змінити довжину файлу, - GetLength, SetLength. p>
При відкритті файлу покажчик поточної позиції файлу
знаходиться на самому початку файлу. Коли порція даних прочитана або записана, то
покажчик поточної позиції переміщується в бік кінця файлу і вказує на
дані, які будуть читатися чи записуватися черговий операцією читання або запису
у файл. p>
Щоб перемістити покажчик поточної позиції файлу в
будь-яке місце, можна скористатися універсальним методом Seek. Він дозволяє
перемістити покажчик на певне число байт щодо початку, кінця або
поточній позиції вказівника. p>
Щоб перемістити покажчик на початок або кінець файлу,
найбільш зручно використовувати спеціальні методи. Метод SeekToBegin переміщує
покажчик у початок файлу, а метод SeekToEnd - в його кінець. p>
Але для визначення довжини відкритого файлу зовсім
необов'язково переміщати його покажчик. Можна скористатися методом
GetLength. Цей метод також повертає довжину відкритого файлу в байтах. Метод
SetLength дозволяє змінити довжину відкритого файлу. Якщо за допомогою цього
методу розмір файлу збільшується, то значення останніх байт не визначено. p>
Поточну позицію покажчика файлу можна визначити з
допомогою методу GetPosition. Повертане методом GetPosition 32-розрядне
значення визначає зміщення покажчика від початку файлу. p>
Характеристики відкритого файлу p>
Щоб визначити розташування відкритого файлу на
диску, треба викликати метод GetFilePath. Цей метод повертає об'єкт класу
CString, в якому міститься повний шлях до файлу, включаючи ім'я диска, каталоги,
назва файлу та його розширення. p>
Якщо потрібно визначити тільки ім'я і розширення відкритого
файлу, можна скористатися методом GetFileName. Він повертає об'єкт класу
CString, в якому знаходиться ім'я файлу. У випадку, коли потрібно довідатися тільки ім'я
відкритого файлу без розширення, користуються методом GetFileTitle. p>
Наступний метод класу CFile дозволяє встановити шлях
файлу. Це метод не створює, не копіює і не змінює імені файлу, він тільки
заповнює відповідний елемент даних в об'єкті класу CFile. p>
Клас CMemFile p>
До бібліотеки MFC входить клас CMemFile, що успадковується від
базового класу CFile. Клас CMemFile представляє файл, розміщений, в
оперативної пам'яті. З об'єктами класу CMemFile так само, як і з об'єктами
класу CFile. Відмінність полягає в тому, що файл, пов'язаний з об'єктом
CMemFile, розташований не на диску, а в оперативній пам'яті комп'ютера. За рахунок
цього операції з таким файлом відбуваються значно швидше, ніж із звичайними
файлами. p>
Працюючи з об'єктами класу CMemFile, можна
використовувати практично всі методи класу CFile, які були описані вище.
Можна записувати дані в такий файл або зчитувати їх. Крім цих методів у
складу класу CMemFile включені додаткові методи. p>
Для створення об'єктів класу CMemFile призначене
два різних конструктора. Перший конструктор CMemFile має всього один
необов'язковий параметр nGrowBytes: p>
CMemFile (UINT nGrowBytes = 1024); p>
Цей конструктор створює в оперативній пам'яті порожній
файл. Після створення файл автоматично відкривається (не потрібно викликати метод
Open). P>
Коли починається запис у такий файл, автоматично
виділяється блок пам'яті. Для отримання пам'яті методи класу CMemFile викликають
стандартні функції malloc, realloc і free. Якщо виділеного блоку пам'яті
недостатньо, його розмір збільшується. Збільшення блоку пам'яті файлу
відбувається по частинах по nGrowBytes байт. Після видалення об'єкта класу CMemFile
використовувана пам'ять автоматично повертається в систему. p>
Другий конструктор класу CMemFile має більш складний
прототип. Це конструктор використовується в тих випадках, коли програміст сам
виділяє пам'ять для файлу: p>
CMemFile (BYTE *
lpBuffer, UINT nBufferSize, p>
UINT nGrowBytes = 0); p>
Параметр lpBuffer вказує на буфер, який буде
використовуватися для файлу. Розмір буфера визначається параметром nBufferSize. P>
необов'язковий параметр nGrowBytes використовується більше
комплексно, ніж у першому конструктора класу. Якщо nGrowBytes містить нуль, то
створений файл буде містити дані з буфера lpBuffer. Довжина такого файлу
буде дорівнює nBufferSize. p>
Якщо nGrowBytes більше нуля, то вміст буфера
lpBuffer ігнорується. Крім того, якщо в такий файл записується більше
даних, ніж міститься у відведеному буфері, то його розмір автоматично
збільшується. Збільшення блоку пам'яті файлу відбувається по частинах по nGrowBytes
байт. p>
Клас CMemFile дозволяє отримати покажчик на область
пам'яті, що використовується файлом. Через цей покажчик можна безпосередньо
працювати з вмістом файла, не обмежуючи себе методами класу CFile. Для
отримання вказівника на буфер файлу можна скористатися методом Detach. Перед
цим корисно визначити довжину файлу (і відповідно розмір буфера пам'яті),
викликавши метод GetLength. p>
Метод Detach закриває дане зображення і повертає
покажчик на використовуваний ним блок пам'яті. Якщо знову буде потрібно відкрити файл і
пов'язати з ним оперативний блок пам'яті, потрібно викликати метод Attach. p>
Потрібно відзначити, що для управління буфером файлу клас
CMemFile викликає стандартні функції malloc, realloc і free. Тому, щоб не
порушувати механізм управління пам'яттю, буфер lpBuffer повинен бути створений
функціями malloc або calloc. p>
Клас CStdioFile p>
Тим, хто звик користуватися функціями потокового
введення/виводу із стандартної бібліотеки C та C + +, слід звернути увагу на
клас CStdioFile, успадкованих від базового класу CFile. Цей клас дозволяє
виконувати буферізірованний введення/виведення в текстовому і довічним режимі. Для
об'єктів класу CStdioFile можна викликати практично всі методи класу CFile. p>
В клас CStdioFile входить елемент даних m_pStream,
який містить покажчик на відкритий файл. Якщо об'єкт класу CStdioFile
створений, але файл ще не відкрито, або закритий, то m_pStream містить константу
NULL. P>
Клас CStdioFile має три різних конструктора.
Перший конструктор класу CStdioFile не має параметрів. Цей конструктор
тільки створює об'єкт класу, але не відкриває ніяких файлів. Щоб відкрити файл,
треба викликати метод Open базового класу CFile. p>
Другий конструктор класу CStdioFile можна викликати,
якщо файл вже відкритий і потрібно створити новий об'єкт класу CStdioFile і пов'язати з
ним відкритий файл. Цей конструктор можна використовувати, якщо файл був відкритий
стандартною функцією fopen. Параметр методу повинен містити покажчик на файл,
отриманий викликом стандартної функції fopen. p>
Третій конструктор можна використовувати, якщо треба
створити об'єкт класу CStdioFile, відкрити новий файл і пов'язати його з тільки що
створеним об'єктом. p>
Для читання і запису в текстовий файл клас CStdioFile
включає два нових методи: ReadString і WriteString. Перший метод дозволяє
прочитати з файлу рядок символів, а другий метод - записати. p>
Приклади запису та читання з файлу p>
Наведемо фрагменти коду, в яких демонструється
використання стандартних діалогових панелей вибрати файл і процедури читання і
запису у файл. p>
Відкриття файлу і читання з нього p>
CString m_Text; ... ...//
створення стандартної панелі p>
вибору файлу Open p>
CFileDialog
DlgOpen (TRUE, (LPCSTR) "txt", NULL, p>
OFN_HIDEREADONLY, (LPCSTR) "
p>
Text Files (*. txt)
| *. txt ||"); p>
// відображення стандартної панелі вибору файлу Open p>
if (DlgOpen.DoModal () == IDOK) ( p>
// створення об'єкта і відкриття файлу для читання p>
CStdioFile
File (DlgOpen.GetPathName (), p>
CFile:: modeRead | CFile:: typeBinary); p>
// читання з файлу рядка p>
CString &
ref = m_Text; File.ReadString (ref < p>
FONT FACE = "Courier New ">); p>
// передається посилання на рядок m_Text) p>
Тут знаходиться робочий код програми, виконаної для
простоти у вигляді консольного застосування під MFC. Щоб програма працювала, не
забудьте зробити наступне: p>
Запустіть програму - Build/Rebuild all (будуть
помилки), виберіть Build/Set active configuration - Win 32 Realise, виберіть
пункт меню "Project", далі
"Settings ...", закладку" C/C + + ",
Category - Code Generation і в пункті "Use run-time
library "виберіть
"Multithreaded". Після цього
зробіть знову Build/Rebuild all і програма буде працювати. p>
Відкриття файлу і запис з нього p>
CString m_Text; ... ...//
створення стандартної панелі p>
вибору файлу SaveAs p>
CFileDialog
DlgSaveAs (FALSE, (LPCSTR) "txt", NULL, p>
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
p>
(LPCSTR) "Text
Files (*. txt) | *. txt ||"); p>
// відображення стандартної панелі вибору p>
файлу SaveAs p>
if (DlgSaveAs.DoModal () == IDOK) ( p>
// створення об'єкта і відкриття файлу для запису p>
CStdioFile
File (DlgSaveAs.GetPathName (), p>
CFile:: modeCreate | CFile:: modeWrite | p>
CFile:: typeBinary);
p>
// запис в файл рядка p>
File.WriteString ((LPCTSTR) m_Text);) p>
Тут находітся робочий код програми, виконаної для
простоти у вигляді консольного застосування під MFC. Щоб програма працювала, не
забудьте зробити наступне: p>
Запустіть програму - Build/Rebuild all (будуть
помилки), виберіть Build/Set active configuration - Win 32 Realise, виберіть
пункт меню "Project", далі
"Settings ...", закладку" C/C + + ",
Category - Code Generation і в пункті "Use run-time
library "виберіть
"Multithreaded". Після цього
зробіть знову Build/Rebuild all і програма буде працювати. p>
Список літератури h2>
Для підготовки даної роботи були використані
матеріали з сайту http://www.realcoding.net
p>