Функции-члены входного потока
Функции — члены потока ввода используются для дисковых операций ввода.
open
Если вы используете входной поток файлов (ifstream
), необходимо связать этот поток с определенным файлом диска. Это можно сделать в конструкторе или использовать функцию open
. В любом случае аргументы одни и те же.
Обычно при открытии файла, связанного с входным потоком ios_base::openmode
(используется ios::in
режим по умолчанию). openmode
Список флагов см. в разделе ios_base::openmode
. Флаги можно объединить с побитовой "или" (|
) оператором.
Чтобы прочитать файл, сначала используйте fail
функцию-член, чтобы определить, существует ли она:
istream ifile("FILENAME");
if (ifile.fail())
// The file does not exist ...
get
Неформатированная get
функция-член работает как >>
оператор с двумя исключениями. Во-первых, get
функция включает символы пробела, а средство извлечения исключает пробелы при skipws
установке флага (по умолчанию). Во-вторых, функция, скорее всего, get
приведет к очистке связанного выходного потока (cout
например).
Вариант функции задает адрес буфера get
и максимальное число символов для чтения. Это полезно для ограничения количества символов, отправленных в конкретную переменную, как показано в примере:
// ioo_get_function.cpp
// compile with: /EHsc
// Type up to 24 characters and a terminating character.
// Any remaining characters can be extracted later.
#include <iostream>
using namespace std;
int main()
{
char line[25];
cout << " Type a line terminated by carriage return\n>";
cin.get( line, 25 );
cout << line << endl;
}
Входные данные
1234
Образец вывода
1234
getline
Функция-член getline
похожа на функцию get
. Обе функции допускают третий аргумент, который указывает завершающий символ для входных данных. Значение по умолчанию — символ новой строки. Обе функции резервируют один символ для необходимого завершающего символа. Тем не менее, get
оставляет конечный символ в потоке и getline
удаляет конечный символ.
В следующем примере задается завершающий символ для потока ввода:
// getline_func.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main( )
{
char line[100];
cout << " Type a line terminated by 't'" << endl;
cin.getline( line, 100, 't' );
cout << line;
}
Входные данные
test
read
Функция-член read
считывает байты из файла в указанную область памяти. Аргумент length определяет количество прочтенных байтов. Если этот аргумент не включен, чтение останавливается при достижении физического конца файла или в случае файла в текстовом режиме при чтении внедренного EOF
символа.
Этот пример считывает двоичную запись из файла заработной платы в структуру:
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
struct
{
double salary;
char name[23];
} employee;
ifstream is( "payroll" );
if( is ) { // ios::operator void*()
is.read( (char *) &employee, sizeof( employee ) );
cout << employee.name << ' ' << employee.salary << endl;
}
else {
cout << "ERROR: Cannot open file 'payroll'." << endl;
}
}
Программа предполагает, что записи данных форматируются точно так же, как указано структурой без конца возвращаемых возвращаемых каретки или символов канала строки.
seekg
и tellg
.
Потоки входного файла хранят внутренний указатель на позицию в файле, с которой будет продолжаться чтение. Этот указатель можно установить функцией seekg
, как показано ниже:
#include <iostream>
#include <fstream>
using namespace std;
int main( )
{
char ch;
ifstream tfile( "payroll" );
if( tfile ) {
tfile.seekg( 8 ); // Seek 8 bytes in (past salary)
while ( tfile.good() ) { // EOF or failure stops the reading
tfile.get( ch );
if( !ch ) break; // quit on null
cout << ch;
}
}
else {
cout << "ERROR: Cannot open file 'payroll'." << endl;
}
}
seekg
Чтобы использовать для реализации систем управления данными, ориентированных на запись, умножьте размер записи фиксированной длины на номер записи, чтобы получить положение байтов относительно конца файла, а затем используйте get
объект для чтения записи.
Функция-член tellg
возвращает текущую позицию в файле для чтения. Это значение имеет тип streampos
, определенный typedef
в <iostream>
. В следующем примере выполняется чтение файла и показ сообщения с позициями пробелов.
#include <fstream>
#include <iostream>
using namespace std;
int main( )
{
char ch;
ifstream tfile( "payroll" );
if( tfile ) {
while ( tfile.good( ) ) {
streampos here = tfile.tellg();
tfile.get( ch );
if ( ch == ' ' )
cout << "\nPosition " << here << " is a space";
}
}
else {
cout << "ERROR: Cannot open file 'payroll'." << endl;
}
}
close
Функция-член close
закрывает файл диска, связанный с входным потоком файлов, и освобождает дескриптор файла операционной системы. Деструктор ifstream
закрывает файл, но можно использовать close
функцию, если нужно открыть другой файл для одного объекта потока.