Функции-члены входного потока

Функции — члены потока ввода используются для дисковых операций ввода.

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 функцию, если нужно открыть другой файл для одного объекта потока.

См. также

Входные потоки