Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]