На этом шаге мы перечислим основные методы работы с этим классом и приведем пример использования классов ввода/вывода.
Этот класс предназначен для организации работ по вводу (чтению) из файла помощью методов этого класса:
#include <fstream> . . . . ifstream FILE; //объявляем переменную FILE типа //ifstream (создаем экземпляр класса) FILE.open ("а.txt"); //вызываем метод открытия файла if ( FILE == NULL ) return 0; //неудачное открытие файла . . . . while(!FILE.eof()) //проверка на признак конца файла { FILE >> p; //чтение из файла cout >> р >> endl; //вывод прочитанных данных на экран } . . . . FILE.close () ; //закрытие файла
Ниже приведен пример использования этих классов: ofstream и ifstream (оба находятся в fstream), результат работы программы показан на рисунке 1.
// 92_1.cpp: главный файл проекта. #include "stdafx.h" #include <iostream> #include <fstream> #include <conio.h> #include <clocale> //обязательно для функции setlocale() #define DelKey 'о' //этот символ будет удаляться из потока #define MAXLINE 1000 using namespace std; // используется стандартное пространство имен using namespace System; void main() { setlocale(LC_ALL,"Russian"); //функция setlocale() с аргументами //для корректного вывода кириллицы //Проверка вывода ofstream FILE; FILE.open ("I:\\a.txt", ios::out); char p[MAXLINE]; int i; streampos p; //для хранения позиции файлового указателя for(i=0; i<2; i++) FILE << "Строка " << i; //<< endl; //endl вводить не надо, иначе и выводить его надо и цикл будет длиннее FILE.close(); //Проверка ввода (чтения по записям) ifstream FILE1; FILE1.open ("I:\\a.txt"); if (FILE1 == NULL) //так надо проверять на ошибку открытия файла return; while (!FILE1.eof()) //так проверяется конец файла { FILE1 >> p >> i; cout << p << i << endl; } FILE1.close(); _getch(); //Проверка посимвольного чтения ifstream FILE2; char c; FILE2.open("I:\\a.txt"); if(FILE2 == NULL) //так проверять на плохое открытие return; while(!FILE2.eof()) //так проверяется конец файла { c=FILE2.peek(); //смотрит, какой следующий символ будет считан, //но указатель позиционирования при этом не сдвигается: //остается на этом символе streamoff cgp=FILE2.tellg(); //определяется текущая позиция в файле if(c == DelKey) //выбрасываются все символы DelKey из читаемого потока { pos = cgp + 1; // готовимся пропустить символ по seekg() //передвинули указатель позиционирования один символ дальше, //чтобы пропустить символ FILE2.seekg(pos); continue; //на продолжение цикла } FILE2.get(c); //чтение символа в с if (c != EOF) cout << c; } //while cout << endl; FILE2.close(); _getch(); system("DEL I:\\a.txt"); // удаление рабочего файла }
Рис.1. Результат работы приложения
Обратите внимание на типы streampos и streamoff. Оба этих типа определены в заголовочном файле iostream и используются для для определения переменныx, содержащих номера позиций файлового указателя. Тип streamoff чаще применяется для задания смещения файлового указателя, а тип streampos - для определения позиции файлового указателя. Отметим, что объект типа streamoff способен содержать самое большое допустимое значение, которое может иметь смещение файлового указателя, а объект типа streampos - самое большое допустимое значение, которое может иметь позиция в файле файлового указателя. В настоящее время эти типы определены с помощью typedef как long.
На следующем шаге мы рассмотрим работу с бинарным файлом.