|
||||||||||||||||
Режимы открытия файла. Закрытие файла. Двоичный режим ввода-вывода2.3.1 Режимы открытия файла Параметр mode, который имеет вторая форма конструктора, задает режим открытия файла. Для значений параметра класс ios определяет символические константы, перечисленные в таблице 11.3. Таблица 11.3. Константы класса ios для режимов открытия файла
Константы можно комбинировать с помощью поразрядного OR. Для конструкторов классов ifstream и ofstream параметр mode имеет значения по умолчанию – соответственно ios::in и ios::out. 2.3.2 Закрытие файла В классах файловых потоков имеется функция close(), которая сбрасывает содержимое потока и закрывает ассоциированный с ним файл. Кроме того, деструктор потока автоматически закрывает файл при уничтожении объекта потока. При ошибке закрытия файла устанавливается флаг failbit. 2.3.3 Двоичный режим ввода-вывода Операций извлечения/передачи данных перегружены для всех встроенных типов и выполняют соответствующие преобразования из внутреннего представления данных в текстовое и из текстового во внутреннее (машинное). Однако в библиотеке C++ имеется немало функций бесформатного ввода-вывода, которые часто применяют для чтения и записи двоичных (не-текстовых) файлов. Двоичный режим открытия файла (с установленным битом binary) означает, что никакой трансляции данных при передаче из файла в поток и обратно производиться не будет. Речь здесь идет не о форматных преобразованиях представления данных. При текстовом режиме (он принимается по умолчанию) при передаче данных между файлом и потоком производится замена пар символов CR/LF на единственный символ LF ('\n') и наоборот. Это происходит до преобразований представления, которые выполняются операциями извлечения/передачи. Двоичный ввод-вывод означает всего-навсего, что такой замены происходить не будет; тем не менее двоичный режим необходим при работе с сырыми данными, т. е. данными в машинной форме без преобразования их в текстовый формат. Чтобы открыть файл в двоичном режиме, нужно, установить в параметре mode конструктора потока или функции open() бит ios::binary. Чтение сырых данных производится функцией read() класса istream: istream &read(char *buf, long len); Здесь buf – адрес буфера, в который будут читаться данные, а len – число символов, которые нужно прочитать. Запись сырых данных производится функцией write() класса ostream. Она выглядит точно так же, как функция read(): ostream &write(char *buf, long len); Здесь buf – адрес буфера, в котором содержатся данные, а len – число символов, которые должны быть записаны в поток. Обе функции возвращают ссылку на свой объект-поток. Это означает, что возможны их цепные вызовы, т. е. выражения вида: ostream os(...); os.write(...).write(...).write(...);
|
||||||||||||||||
|