Особенности работы с бинарными файлами

Методы read и write

Метод getline

Для ввода строк предусмотрен также метод getline, имеющий две формы – с двумя и тремя параметрами.

istream& getline (char *buf, streamsize num);

istream& getline (char *buf, streamsize num, char delim);

где streamsize – разновидность типа int. Первый параметр – это адрес области памяти для ввода данных, второй – увеличенное на 1 максимальное число вводимых символов, возможный третий – символ-ограничитель, ввод которого прекращает чтение вне зависимости от числа введенных символов. Метод getline считывает символы из входного потока в область ввода, адресуемую указателем buf, до тех пор, пока их число не достигнет num-1 или не встретится конец файла. Кроме того, прекращение чтения для первой формы вызывает символ перехода на новую строку (код клавиши "Enter" ('\n' или '\xA'), а для второй формы – символ, указанный в списке фактических параметров в качестве delim. Эти символы извлекаются из входного потока, но в область ввода не записываются. После прочитанных в область ввода buf символов обе формы метода getline записывают завершающий строку нулевой символ.

Легко заметить сходство метода функции getline с методом get, имеющим несколько параметров. Различие их состоит в том, что getline удаляет из входного потока символ перехода на новую строку (код клавиши "Enter"), а get, как и операция >>, – нет.

Для ввода-вывода нескольких байтов данных определены также методы read иwrite:

istream& read (char* buf, int nCount);

ostream& write (const char* buf, int nCount);

Метод read вводит указанное в nCount количество байтов (символов) в память, начиная с адреса buf. Метод writeвыводит указанное в nCount количество байтов (символов), расположенных в памяти, начиная с адреса buf.

Бинарные файлы, в отличие от текстовых, могут хранить числовые данные в их внутреннем, числовом формате. Для ввода данных из бинарного файла может использоваться метод read, для вывода в бинарный файл – метод write.

Если вводимые или выводимые данные не являются символами или строками, например, это числа, структуры или объекты, необходимо выполнять преобразование адресов данных, передаваемых методам read иwrite, к типу char*. В этом случае данные, начиная с указанного адреса, будут рассматриваться как коды символов и произойдет их побайтовый ввод (вывод) без какого-либо промежуточного преобразования. В качестве числа вводимых (выводимых) байтов следует указывать размер переменной соответствующего типа (например, 2 – для переменных типа short, 4 – для переменных типа long, размер, вычисленный с помощью операции sizeof, – для массивов, структур и объектов).

Для бинарного вывода файл должен быть открыт с режимом ios::binary, поскольку в противном случае каждый байт потока со значением 10 (шестнадцатеричным 0A) в файле будет заменен парой байтов со значениями 13 и 10 (шестнадцатеричными 0D и 0A).