- •Лекция №8
- •9. Файлы
- •9.1. Работа с файлами в языке с Открытие и закрытие файла
- •Функция fclose
- •Функция fcloseall
- •Функция feof
- •Функция fscanf
- •Функция freopen
- •Функция ftmpfile
- •Функция fdopen
- •Функция eof
- •Функция fgetpos
- •Функция fileno
- •Функция flushall
- •Функция dup
- •Функция dup2
- •Функции ввода-вывода
- •Функция fgetc
- •Функция getc
- •Функция ungetc
- •Функция fputs
- •Функция fread
- •Функция fwrite
- •Функция fseek
- •Функция fsetpos
- •Функция fstat
- •Функция ftell
- •Открытие и закрытие файлов
- •Класс istream
- •Функции get, getline и read
- •Функция возвращения
- •Позиционирование потока
- •Класс ostream
- •Функции вывода put и write
- •Функции класса filebuf
- •Функции класса streambuf
- •Функции класса strstreambuf
- •Определение состояния потока
Класс istream
Функции управления потоковым вводом сосредоточены в классе istream. С каждым из объектов этого класса и его производных связан объект класса streambuf. Функции класса istream, доступные его потомкам, перечислены в таблице.
Функция |
Назначение |
ipfx
|
Вызывается перед операцией чтения для проверки наличия ошибок в потоке |
isfx |
Вызывается после каждой операции чтения |
get
|
Извлекает из потока требуемое число символов; если указан символ-ограничитель, он не извлекается |
getline
|
Извлекает из потока требуемое число символов; если указан символ-ограничитель, он извлекается, но не сохраняется в буфере |
read
|
Извлекает из потока требуемое число байтов; применяется при работе с двоичными потоками |
istream& istream::ignore (int n, int d);
|
Выбрасывает из потока требуемое число символов вплоть до символа-ограничителя |
int istream::peek(); |
Возвращает значение очередного символа, не извлекая его из потока |
int istream::gcount()
|
Определяет число символов, извлеченных из потока во время последней операции чтения |
eatwhite
|
Извлекает из потока ведущие пробельные символы; аналогичное действие выполняет манипулятор ws |
istream& istream::putback (char ch); |
Возвращает в поток символы, извлеченные из него во время последней операции чтения |
sync
|
Синхронизирует внутренний буфер потока с внешним источником символьных данных |
istream& istream::seekg (streampos); istream& istream::seekg (streampoff,ios::seek_dir); |
Перемещает маркер, обозначающий текущую позицию чтения, на требуемую позицию в потоке |
streampos istream::tellg() |
Возвращает позицию маркера чтения |
Функции get, getline и read
Следующий вариант get позволяет управлять числом извлекаемых символов, их размещением и оконечным символом:
istream& istream::get(char *buf, int max, int term[='\n']);
Эта функция считывает символы из входного потока в символьный массив buf до тех пор, пока не будет считано max символов, либо пока не встретится символ, заданный term, либо пока не встретится конец файла, в зависимости оттого, что произойдет раньше. Завершающий пустой символ добавляется автоматически. По умолчанию терминатором (который не обязательно задавать) является символ новой строки ('\n'). Сам терминатор в массив buf не считывается и из istream не удаляется. Массив buf должен иметь размер как минимум max символов.
Пример:
#include <iostream.h>
#define NUMCHAR 45
void main()
{ char name[NUMCHAR+1];
cout<<"Введите ваше имя и фамилию:\n";
cin.get(name,NUMCHAR);
cout<<"\nСпасибо,"<<name;
}
В функции cin.get() первый аргумент – имя переменной, принимающей данные; второй – максимальное число вводимых символов: третий (необязательный) – символ, служащий признаком окончания ввода (по умолчанию используется символ \n). Функция cin.get() считывает все символы в строке, включая пробелы и знаки табуляции, пока не будет прочитано указанное число символов или не встретится символ-ограничитель. Так, например, если в качестве ограничителя используется символ ’*’, то необходимо записать оператор ввода следующим образом
cin.get(name,NUMCHAR,’*’);
Функция
istream& istream::getline(char *buf, int max, int term);
считывает символы из входного потока в символьный массив buf до тех пор, пока не будет считано max символов, либо пока не встретится символ, заданный term, либо пока не встретится конец файла, в зависимости оттого, что произойдет раньше. Завершающий пустой символ добавляется автоматически. По умолчанию терминатором (который не обязательно задавать) является символ новой строки ('\n'). В отличие от функции get функция getline терминатор в массив buf считывает и из istream удаляет.
Самостоятельная проработка:
Можно прочитать "сырые" двоичные данные с помощью функции read:
istream& istream::read( signed char* ptr, int n);
istream& istream::read( unsigned char* ptr, int n);
Пример:
cin.read ( (char*)&x, sizeof(x) );
Для типа char* (рассматриваемого как строка) действие операции >> состоит в пропуске пробельных символов и записи следующих (не пробельных) символов до тех пор, пока не встретится следующий пробельный символ. Затем добавляется завершающий нулевой (0) символ. Следует предъявлять осторожность и избегать "переполнения" строки. Ширина по умолчанию, равная нулю (означает, что предельное значение не задано), может быть изменена при помощи width (или setw) следующим образом:
char array[SIZE];
...
// инициализация массива
...
cin.width(sizeof(array));
cin >> array // позволяет избежать переполнения
В случае любого ввода встроенных типов, если конец ввода встретится ранее первого не пробельного символа, в мишень buf ничего записано не будет, а состояние istream будет установлено равным "отказу". Таким образом, если мишень была не инициализирована, то она и останется не инициализированной.
