- •О.С. Зеленський
- •Розділ 1. Загальні відомості створення додатку windows
- •1.1. Створення додатку Windows за допомогою майстра AppWizard
- •1.2. Варіанти майстрів для різних проектів
- •1.3. Короткий опис sdi програми
- •1.4. Короткий опис mdi програми
- •1.5. Короткий опис простого діалогового додатку
- •Контрольні питання
- •Розділ 2. Повідомлення і команди
- •2.1. Обробка повідомлень
- •2.2. Цикли обробки повідомлень
- •2.3. Карти повідомлень
- •Контрольні питання
- •Розділ 3. Документи та види
- •3.1. Клас додатку
- •3.2. Клас головного вікна
- •3.3. Клас документа
- •3.4. Класи виду
- •Контрольні питання
- •Розділ 4. Робота з клавіатурою, мишею і меню
- •4.1. Робота з клавіатурою
- •4.2. Робота з мишею
- •4.3. Робота з меню
- •Контрольні питання
- •Розділ 5. Виведення на екран
- •5.1. Класи графічних об'єктів
- •5.2. Робота зі шрифтами
- •5.3. Робота з пензликами та малювання графічних фігур
- •5.4. Робота з пензликом
- •5.5. Робота зі скролінгом
- •5.6. Приклад роботи з таблицями
- •5.7. Малювання на екрані маніпулятором "миша"
- •5.8. Завантаження та виведення на екран бітових зображень
- •5.9. Копіювання бітових образів
- •5.10. Малювання графічних об'єктів з використанням резинових контурів та метафайлів
- •5.11. Виділення графічних об'єктів у прямокутній області
- •5.12. Універсальний приклад роботи з двовимірною графікою з використанням резинового контуру
- •5.13. Запис на диск та зчитування з диску графічних об'єктів
- •5.14. Побудова кругових діаграм і гістограм
- •5.15. Користувацький режим роботи з графікою на прикладі малювання годинника Clock
- •Контрольні питання
- •Завдання
- •Розділ 6. Друк і попередній перегляд документів
- •6.1. Вибір і налаштування параметрів друку
- •6.2. Створення контекста пристрою
- •6.3. Друк документів і бібліотека mfc
- •6.4. Масштабування
- •6.5. Друк багатосторінкового документа
- •Контрольні питання
- •Розділ 7. Робота з файлами
- •7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
- •7.1.1. Робота з класом cFile
- •7.1.2. Робота з потоком fstream
- •Можливі режими доступу
- •7.1.3. Робота з класом cStdioFile
- •7.2. Серіалізація даних, клас cArchive
- •7.3. Використання реєстру в додатках
- •Контрольні питання
- •Завдання
- •Розділ 8. Діалогові вікна
- •8.1. Створення діалогового вікна та простіші елементи керування
- •8.2. Робота зі списками і комбінованими полями
- •8.3. Ускладнений приклад зі списками
- •8.4. Робота з повзунками
- •8.5. Виведення бітових матриць в діалозі та у вікні виду
- •8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор
- •8.7. Стандартні діалоги вибору файлів, шрифтів та кольору
- •8.8. Взаємоз'вязок діалога, документа та виду при розробці додатку
- •8.8.1. Клас cDialDoc
- •8.8.2. Клас cDialView
- •8.8.3. Клас Cdlg
- •8.9. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
7.1.3. Робота з класом cStdioFile
Клас CStdioFile є успадкованим від класу CFile. Цей клас дозволяє виконувати буферизоване введення/виведення в текстовому і двійковому режимах.
У текстовому режимі виконується спеціальна обробка символів повернення каретки та переведення рядка. Коли в файл, відкритий в текстовому режимі, записується символ переведення рядка \n (код 0x0A), він перетворюється в два символи – символ переходу рядка (код 0x0A) і символ повернення каретки (код 0x0D). І навпаки, коли з файлу зчитується пара символів переведення рядка і повернення каретки, вони перетворюються в один символ переходу рядка.
Для об'єктів класу CStdioFile можна викликати всі методи його базового класу CFile, крім методів Duplicate, LockRange і UnlockRange.
В клас CStdioFile входить елемент даних m_pStream, який містить вказівку на відкритий файл. Якщо об'єкт CStdioFile створений, але файл або ще не відкритий, або закритий, тоді m_pStream містить константу NULL.
Клас CStdioFile має три різних конструктори. Перший конструктор класу CStdioFile не має параметрів:
CStdioFile();
Цей конструктор тільки створює об'єкт класу, але не відкриває файл. Щоб відкрити файл, треба викликати метод Open базового класу CFile.
Другий конструктор класу CStdioFile можна викликати, якщо файл вже відкритий і вам треба створити новий об'єкт класу і пов'язати з ним відкритий файл:
CStdioFile(FILE* pOpenStream);
Цей конструктор можна використовувати, якщо файл був відкритий стандартною функцією fopen.
Параметр pOpenStream повинен містити вказівку на файл, отриману викликом стандартної функції fopen.
Третій, останній конструктор можна використовувати, якщо треба створити об'єкт класу CStdioFile, відкрити новий файл і пов'язати його з щойно створеним об'єктом:
CStdioFile(LPCTSTR lpszFileName, UINT nOpenFlags);
throw(CFileException);
Якщо зазначений файл не може бути відкритий, викликається виключення CFileException.
Параметр lpszFileName повинен містити вказівку на рядок з ім'ям файлу. Можна вказати повний шлях до файлу, а не тільки його ім'я. Параметр nOpenFlags визначає режим, в якому буде відкритий файл. Можливі значення цього параметра були описані раніше (див. метод Open класу CFile і табл. 7.2).
Для читання і запису в текстовий файл клас CStdioFile включає два нових методи ReadString і WriteString. Метод ReadString дозволяє прочитати з файлу рядок символів, а метод WriteString – записати.
Метод ReadString має дві форми. Перша використовується для читання рядків з файлу в буфер пам'яті, а друга для читання рядків і запису їх в об'єкт класу CString.
Ось опис першої форми методу ReadString:
virtual LPTSTR ReadString(LPTSTR lpsz, UINT nMax);
throw(CFileException);
З відкритого файлу зчитується текстовий рядок і записується в буфер lpsz. Вважається, що рядок файлу закінчується символами переведення рядка і повернення каретки. В кінець рядка, записаного в буфер lpsz, заноситься символ двійкового нуля (‘\0’).
Максимальна кількість зчитуваних символів визначається параметром nMax. Якщо в рядку файлу більше, ніж nMax-1 байт, то інші символи не будуть прочитані. Метод ReadString повертає вказівку на прочитаний рядок або NULL, якщо досягнуто кінець файлу.
Друга форма методу ReadString не набагато відрізняється від першої. Замість двох параметрів lpsz і nMax вказується один параметр rString, що вказує на об'єкт класу CString, в який буде записано рядок, прочитаний з файлу:
BOOL ReadString(CString& rString);
throw(CFileException);
Ще одна відмінність другої форми методу ReadString полягає в типі повертаємого ним значення. Якщо досягнуто кінець файлу, то друга форма методу ReadString повертає константу FALSE.
Для запису в файл текстового рядка призначений метод WriteString:
virtual void WriteString(LPCTSTR lpsz);
throw(CFileException);
В якості параметру lpsz цього методу треба вказати адресу буфера з текстовим рядком, який закінчується символом ‘\0’. Символ ‘\0’ не записується у файл. Якщо в текстовому рядку lpsz є символи переведення рядка, вони записуються як пара символів повернення каретки та переведення рядка.
Метод WriteString може викликати виключення, якщо під час запису в файл відбудеться помилка, наприклад переповнення диску.
У функції відгуку OnButton3 наведена робота з текстовими файлами за допомогою класу CStdioFile.
void CFileDlg::OnButton4()
{
CStdioFile f1;
if(!f1.Open("1.txt",CFile::modeCreate |
CFile::modeReadWrite | CFile::typeText ))
{
#ifdef _DEBUG
afxDump << "Unable to open file" << "\n";
#endif
return;
}
f1.WriteString("1234567\n");
f1.WriteString("590");
CString str,vv="";
f1.Seek(0L, CFile::begin);
while(1)
{
f1.ReadString(str);
if(str.GetLength()==0)break;
vv+=str;
vv+="\n";
}
MessageBox(vv);
f1.Close();
}
У даному фрагменті відбувається запис рядків до текстового файлу за допомогою функції WriteString та читання відповідних рядків за допомогою функції ReadString.
Результат роботи фрагменту програми приведено на рис. 7.4.
Рис. 7.4. Результат роботи з текстовими файлами на основі класу CStdioFile