Таблица 17.20. Многобайтовые низкоуровневые операции ввода-вывода
is.get(sink, size, delim) | Читает до size байтов из потока is и сохраняет их в символьном массиве, начиная с адреса, на который указывает sink . Чтение продолжается, пока не встретится символ delim , либо пока не прочитано size байтов, либо пока не кончится файл. Если параметр delim присутствует, то его значение остается во входном потоке и не читается в sink |
is.getline(sink, size, delim) | To же поведение, что и версии функции get() с тремя аргументами, но читает и отбрасывает delim |
is.read(sink, size) | Читает до size байтов в символьный массив sink . Возвращает поток is |
is.gcount() | Возвращает количество байтов, прочитанных из потока is при последним вызове функции не форматированного чтения |
os.write(source, size) | Записывает size байтов из символьного массива source в поток os |
is.ignore(size, delim) | Читает и игнорирует до size символов, включая delim . В отличие от других не форматированных функций, ignore() имеет аргументы по умолчанию: для size — 1 и для delim — конец файла |
Функции get()
и getline()
имеют схожие, но не идентичные параметры. В каждом случае sink
— это символьный массив, в который помещаются данные. Обе функции читают, пока не будет выполнено одно из следующих условий:
• Прочитано size - 1
символов.
• Встретился конец файла.
• Встретился символ разделения.
Эти функции отличаются обработкой разделителя: функция get()
оставляет разделитель как следующий символ потока istream
, а функция getline()
читает и отбрасывает разделитель. В любом случае разделитель sink
.
Некоторые из операций читают из ввода неизвестное количество байтов. Для определения количества символов, прочитанных последней операцией не форматированного ввода, можно вызвать функцию gcount()
. Имеет смысл вызывать функцию gcount()
перед любым вмешательством в операции не форматированного ввода. В частности, операции с единичными символами, возвращающими их в поток, также являются операциями не форматированного ввода. Если функции peek()
, unget()
или putback()
будут вызваны перед вызовом функции gcount()
, то будет возвращено значение 0.
Упражнение 17.37. Используйте не форматированную версию функции getline()
для чтения файла по строке за раз. Проверьте программу на примере файла с пустыми строками, а также со строками, длинна которых больше символьного массива, переданного функции getline()
.
Упражнение 17.38. Дополните программу из предыдущего упражнения так, чтобы выводить каждое прочитанное слово в отдельной строке.
17.5.3. Произвольный доступ к потоку
Некоторые из потоковых классов обеспечивают произвольный доступ к данным связанного с ними потока. Положение в потоке можно изменить так, чтобы прочитать сначала последнюю строку, затем первую и т.д. Для
Хотя функции seek()
и tell()
определены для всех потоковых классов, возможные для них действия определяются видом объекта, с которым связан поток. В большинстве систем поток, с которым связан потоковый объект cin
, cout
, cerr
или clog
, cout
? Применить функции seek()
и tell()
, конечно, можно, но во время выполнения это приведет к ошибке и переходу потока в недопустимое состояние.