Compartilhar via


Funções membro de fluxo de entrada

Funções de membro de fluxo de entrada são usadas para entrada de disco.

open

Se estiver usando um fluxo de arquivo de entrada (ifstream), você deve associar o fluxo a um arquivo de disco específico. É possível fazer isso no construtor ou usando a função open. Nos dois casos, os argumentos são os mesmos.

Normalmente, você especifica um sinalizador ios_base::openmode quando abre o arquivo associado a um fluxo de entrada (o modo padrão é ios::in). Para uma lista dos sinalizadores openmode, consulte ios_base::openmode. Os sinalizadores podem ser combinados com o operador bit a bit "ou" (|).

Para ler um arquivo, use primeiro a função membro failpara determinar se existe:

istream ifile("FILENAME");

if (ifile.fail())
// The file does not exist ...

get

A função membro get não formatada funciona como o operador >> com duas exceções. Primeiro, a função get inclui caracteres de espaço em branco, enquanto o extrator exclui espaços em branco quando o sinalizador skipws é definido (padrão). Segundo, a função get tem menos probabilidade de fazer com que um fluxo de saída associado (cout, por exemplo) seja liberado.

Uma variação da função get especifica um endereço de buffer e o número máximo de caracteres a serem lidos. Isso é útil para limitar o número de caracteres enviados para uma variável específica, como este exemplo mostra:

// 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;
}

Entrada

1234

Saída de exemplo

1234

getline

A função membro getline é semelhante à função get. As duas funções permitem um terceiro argumento que especifica o caractere de encerramento para a entrada. O valor padrão é o caractere newline. As duas funções reservam um caractere para o caractere de encerramento necessário. No entanto, get deixa o caractere de encerramento no fluxo e getline remove o caractere de encerramento.

O exemplo a seguir especifica um caractere de encerramento para o fluxo de entrada:

// 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;
}

Entrada

test

read

A função de membro read lê bytes de um arquivo para uma área de memória especificada. O argumento de tamanho especifica o número de bytes lidos. Se você não incluir esse argumento, a leitura para quando o final de arquivo físico é atingido ou, no caso de um arquivo de modo de texto, quando o caractere EOF inserido é lido.

Este exemplo lê um registro binário de um arquivo de folha de pagamento em uma estrutura:

#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;
   }
}

O programa presume que os registros de dados estão formatados exatamente conforme especificado pela estrutura, sem nenhum caractere de avanço de linha ou de retorno de carro de encerramento.

seekg e tellg

Fluxos de arquivo de entrada mantêm um ponteiro interno para a posição no arquivo em que os dados devem ser lidos em seguida. Defina esse ponteiro com a função seekg, conforme mostrado aqui:

#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;
   }
}

Para usar seekg para implementar sistemas de gerenciamento de dados voltados aos registros, multiplique o tamanho do registro de tamanho fixo pelo o número do registro para obter a posição do byte em relação ao final do arquivo e, em seguida, use o objeto get para ler o registro.

A função membro tellg retorna a posição do arquivo atual para leitura. Esse valor é do tipo streampos, um typedef definido em <iostream>. O exemplo a seguir lê um arquivo e exibe mensagens mostrando as posições de espaços.

#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

A função membro close fecha o arquivo de disco associado a um fluxo de arquivo de entrada e libera o identificador de arquivo do sistema operacional. O destruidor ifstream fecha o arquivo para você, mas você pode usar a função close se precisar abrir um outro arquivo para o mesmo objeto de fluxo.

Confira também

Fluxos de entrada