C++
Home

Arquivos - Acesso Sequêncial

C++ não impõe nenhuma estrutura a um arquivo. Assim, conceitos como o de regitros não existem em arquivos em C++. Portanto, o programador deve estruturar os arquivos de modo a satisfazer as exigências das aplicações.

Arquivos são abertos criando-se objetos das classes stream ifstream, ofstream ou fstream.

Ofstream é um objeto, seus modos de abertura do arquivo pode ser tanto ios::out, que trunca o arquivo ou, se ele não existir, cria. E ios::app que acrescenta no final do arquivo.

A declaração

ofstream Arquivo( "arquivo.txt", ios::out 0);

Abre um arquivo para saida ( incluir dados no arquivo ).

ios::app Grava toda a saida no fim do arquivo
ios::ate Abre um arquivo para saída e avança até o fim do arquivo ( normalmente usado para acrescentar dados a um arquivo ). Os dados podem ser gravados em qualquer lugar no arquivo.
ios::in Abre um arquivo para entrada
ios::out Abre um arquivo para saida
ios::trunc Elimina o conteúdo do arquivo se ele existe ( esta também é a ação default para ios::out )
ios::binary Abre um arquivo para entrada ou saída binária ( não texto )

 

Incluindo dados em um arquivo sequencial

#include <iostream>

using std::cout;
using std::cin;
using std::endl;
using std::cerr;

using std::ios;

#include <fstream>

using std::ofstream;

#include <cstdlib>

int main()
{

   // abre um arquivo
   ofstream arquivo ( "arquivo.txt", ios::out );

   // operador ! sobrecarregado, verifica se tudo ocorreu bem
   if ( !arquivo )
   { 
      cerr << "Arquivo nao pode ser aberto" << endl;

      // prototipo cstdlib
      exit( 1 );
   }

   cout << "Digite o Nome e Idade" << endl;

   char nome[30];
   int idade = 0;

   int total = 1;
   while ( total <= 5 )
   { 
      total++;
      cin >> nome >> idade;
      arquivo << nome << ' ' << idade << '\n';
   }

   // arquivo.close(); //fecha explicitamente

   // neste caso, return destroi ofstream e fecha arquivo
   return 0;
}

- Tente sempre fechar explicitamente os arquivos abertos.

Lendo dados de um arquivo de acesso sequencial

Para abrir o arquivo criado anteriormente, usamos ifstream.
Ifstream recebe dois argumentos :

ifstream arquivo("arquivo.txt", ios::in );

Exemplo:

#include <iostream>

using std::cout;
using std::cin;
using std::endl;
using std::cerr;

using std::ios;

#include <fstream>

using std::ofstream;

// detalhe
using std::ifstream;

#include <cstdlib>

#include <iomanip>

using std::setiosflags;
using std::resetiosflags;
using std::setw;
using std::setprecision;

// prototipo de saida de linha personalizada
void saida( const char * const, int );

int main()
{

  // abre um arquivo
  ofstream arquivo ( "arquivo.txt", ios::out );

  // operador ! sobrecarregado, verifica se tudo ocorreu bem
  if ( !arquivo )
  { 
    cerr << "Arquivo nao pode ser aberto" << endl;

    // prototipo cstdlib
    exit( 1 );
  }

  cout << "Digite o Nome e Idade" << endl;

  char nome[30];
  int idade = 0;

  int total = 1;
  while ( total <= 5 )
  { 
    total++;
    cin >> nome >> idade;
    arquivo << nome << ' ' << idade << '\n';
  }


  // fim da inclusão
  arquivo.close();

  // abre o arquivo para leitura
  ifstream lendo ( "arquivo.txt", ios::in );

  if ( !lendo )
  { 
    cerr << "Arquivo nao pode ser aberto" << endl;
    exit( 1 );
  }

  cout << endl << endl;
  cout << setiosflags( ios::left ) << setw(13) << "Nome" << setiosflags( ios::left ) << setw(10) <<   "Idade" << endl;

  while ( lendo >> nome >> idade )
  {  
    saida( nome, idade );
  }



  // neste caso, return destroi ofstream e fecha arquivo
  return 0;
}

void saida( const char * const nome, int idade )
{
  cout << setw(13) << nome << setiosflags( ios::left ) << setw(10) << idade << endl;
}