Работа с файлами Часть 1 - Разбираем класс
Для работы с файлами в MFC существует класс CFile. Этот класс на много удобнее чем изветные нам функции из stdio и iostream.Чтобы получить возможность использовать этот класс, надо в ваш проэкт вклюить файл afx.h(если вы используете мастер создание проэкта, то этот файл будетавтоматически добавлен к проэкту)
Класс CFile предоставляет нам большой набор функций для работы с файлами, но самыми важными для нас являются функции чтения-записи, и функции позицирования(установки указателя в нужное место в открытом файле)Функции:
CFile::Open - функция служит для открытия файла.CFile:: Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL ); lpszFileName - строка содержащая путь к файлу.
nOpenFlags - флаги для открытия файла. В основном ипользуются флаги modeRead - открыть для чтения, modeWrite - открыть для записи и modeCreate - создать файл. Флаги можно комбинировать используя символ "|".
CFileException* pError = NULL - указатель на переменную которая будет содержать информацию об ошибке открытия файла. Функция Open возвращает не нулевое значение в случае если открытие прошло успешно. Либо возращает 0 если произошла ошибка - в этом случае переменная pError будет содержать информацию об ошибке.
Пример:
lpBuf - указатель на переменную для приема данных прочитаных из файла nCount - указывает сколько байт прочитать из файла. Функция возвращает кол-во байт прочитаных из файла(это значение может быть меньше nCount в том случае если достигнут конец файла)CFile openFile; CString fName; fName = "file.txt"; if(!openFile.Open(fName, CFile::modeRead|CFile::modeWrite, NULL)) { //Тут действия в случае ошибки } CFile::Close - служит для закрытия файла. Функция требует аргументов. CFile::Read - служит для чтения из файла(если файл был открыт с флагом CFile::modeRead) CFile::Read(void* lpBuf, UINT nCount);
Пример:
lpBuf - указатель на переменную содержащию данные для записи в файл nCount - кол-во байт которое будет записанно CFile::GetLength - служит для получения размера открытого файла. Часть 2 - пишем программуextern CFile cfile; char pbuf[100]; UINT nBytesRead = cfile.Read( pbuf, 100 ); CFile::Write - служит для записи в файл CFile::Write( const void* lpBuf, UINT nCount );
Итак, мы с вами напишем программу которая будет - открывать текстовый файл, и считывать его содержимое в EditBox на форме.
Создаем новый проэкт MFC AppWizard(EXE) - Проделываем все шаги из прошлого урока. Project name - step4 Открое в ресурсах нашу форму и накидаем на нее контролы:
1 кнопка - IDC_OPEN, Open2 EditBox:
1) IDC_EditOpen
2) IDC_EditText, и на вкладке Style ставим галочку на Multiline, Vertical Scroll и Want Return
Теперь так же, как в предыдущей статье присвоим нашим EditBox"ам переменные с помощью ClassWizard(CTRL+W)
Для IDC_EditOpen - m_EditOpenДля IDC_EditText - m_EditText
Для IDC_OPEN - m_bOpen
Так же добавим 1 глобальную переменную(как в прошлом уроке)
Type - boolName - OpenRead
Public
И в файле step4Dlg.cpp в функции BOOL CStep4Dlg::OnInitDialog() после строчки // TODO: Add extra initialization here Проинициализируем ее OpenRead = false;
Щелкаем два раза на кнопке Open и начинаем писать код.
void CStep4Dlg::OnOpen() { // TODO: Add your control notification handler code here CString fname; //Переменная для хранения имени файла CFile file; //обьект класса CFile char ch[1024]; //Буффер для чтения данных из файла if(!OpenRead) //Если OpenRead=false то показываем диалог открытия файлов { CFileDialog fDialog(TRUE); fDialog.DoModal(); m_EditOpen.SetWindowText(fDialog.GetPathName()); m_bOpen.SetWindowText("Read"); OpenRead = true; } else //Иначе { m_EditOpen.GetWindowText(fname); //Получаем имя файла if(!file.Open(fname, CFile::modeRead, NULL)) //Открываем его { AfxMessageBox("Cannot open file"); return; } file.Read(&ch, 1024); //Читаем 1024 байт m_EditText.SetWindowText(ch); file.Close(); //Закрываем файл m_bOpen.SetWindowText("Open");//Меняем текст кнопки OpenRead = false; } }
Я думаю из коментариев все понятно. Остановлюсь лишь на классе CFileDialog этот класс используется для показа диалогов открыти/закрытия файлов. CFileDialog fDialog(TRUE);
Обьявляем обьект класса. Значение TRUE говорит о том, что мы хотим Диалог открытия Файлов. Если поствить FALSE, то мы увидим Диалог Сохранения Файлов fDialog.DoModal()
Показывает диалог m_EditOpen.SetWindowText(fDialog.GetPathName()); Копируем в наш EditBox полный путь выбраному файлу, с помощью функции GetPathName() Подробние про функцию CFileDialog можно почитать тут
Ну вот и все. До встречи.
© s0 22.03.2007


