Arquivos e fluxos C ++

Até agora, temos usado o iostream biblioteca padrão, que fornece cin e cout métodos para leitura da entrada padrão e gravação na saída padrão, respectivamente.

Este tutorial irá ensiná-lo a ler e escrever a partir de um arquivo. Isso requer outra biblioteca C ++ padrão chamadafstream, que define três novos tipos de dados -

Sr. Não Tipo de dados e descrição
1

ofstream

Este tipo de dados representa o fluxo do arquivo de saída e é usado para criar arquivos e gravar informações em arquivos.

2

ifstream

Este tipo de dados representa o fluxo do arquivo de entrada e é usado para ler informações dos arquivos.

3

fstream

Esse tipo de dados representa o fluxo de arquivos em geral e tem os recursos ofstream e ifstream, o que significa que pode criar arquivos, gravar informações em arquivos e ler informações de arquivos.

Para executar o processamento de arquivos em C ++, os arquivos de cabeçalho <iostream> e <fstream> devem ser incluídos em seu arquivo de origem C ++.

Abrindo um arquivo

Um arquivo deve ser aberto antes que você possa ler ou gravar nele. Ouofstream ou fstreamobjeto pode ser usado para abrir um arquivo para escrita. E o objeto ifstream é usado para abrir um arquivo apenas para leitura.

A seguir está a sintaxe padrão para a função open (), que é membro dos objetos fstream, ifstream e ofstream.

void open(const char *filename, ios::openmode mode);

Aqui, o primeiro argumento especifica o nome e a localização do arquivo a ser aberto e o segundo argumento do open() A função de membro define o modo em que o arquivo deve ser aberto.

Sr. Não Sinalizador e descrição do modo
1

ios::app

Modo anexo. Todas as saídas desse arquivo devem ser anexadas ao final.

2

ios::ate

Abra um arquivo para saída e mova o controle de leitura / gravação para o final do arquivo.

3

ios::in

Abra um arquivo para leitura.

4

ios::out

Abra um arquivo para gravação.

5

ios::trunc

Se o arquivo já existir, seu conteúdo será truncado antes de abrir o arquivo.

Você pode combinar dois ou mais desses valores por ORjuntando-os. Por exemplo, se você deseja abrir um arquivo no modo de gravação e deseja truncá-lo caso já exista, a seguinte será a sintaxe -

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

De maneira semelhante, você pode abrir um arquivo para leitura e gravação da seguinte maneira -

fstream  afile;
afile.open("file.dat", ios::out | ios::in );

Fechando um Arquivo

Quando um programa C ++ termina, ele automaticamente libera todos os fluxos, libera toda a memória alocada e fecha todos os arquivos abertos. Mas é sempre uma boa prática que um programador feche todos os arquivos abertos antes de encerrar o programa.

A seguir está a sintaxe padrão para a função close (), que é membro dos objetos fstream, ifstream e ofstream.

void close();

Gravando em um Arquivo

Ao fazer programação C ++, você grava informações em um arquivo de seu programa usando o operador de inserção de fluxo (<<) da mesma forma que usa esse operador para enviar informações para a tela. A única diferença é que você usa umofstream ou fstream objeto em vez do cout objeto.

Lendo de um arquivo

Você lê as informações de um arquivo em seu programa usando o operador de extração de fluxo (>>) da mesma forma que usa esse operador para inserir informações do teclado. A única diferença é que você usa umifstream ou fstream objeto em vez do cin objeto.

Ler e escrever exemplo

A seguir está o programa C ++ que abre um arquivo no modo de leitura e gravação. Depois de gravar as informações inseridas pelo usuário em um arquivo denominado afile.dat, o programa lê as informações do arquivo e as exibe na tela -

#include <fstream>
#include <iostream>
using namespace std;
 
int main () {
   char data[100];

   // open a file in write mode.
   ofstream outfile;
   outfile.open("afile.dat");

   cout << "Writing to the file" << endl;
   cout << "Enter your name: "; 
   cin.getline(data, 100);

   // write inputted data into the file.
   outfile << data << endl;

   cout << "Enter your age: "; 
   cin >> data;
   cin.ignore();
   
   // again write inputted data into the file.
   outfile << data << endl;

   // close the opened file.
   outfile.close();

   // open a file in read mode.
   ifstream infile; 
   infile.open("afile.dat"); 
 
   cout << "Reading from the file" << endl; 
   infile >> data; 

   // write the data at the screen.
   cout << data << endl;
   
   // again read the data from the file and display it.
   infile >> data; 
   cout << data << endl; 

   // close the opened file.
   infile.close();

   return 0;
}

Quando o código acima é compilado e executado, ele produz a seguinte entrada e saída de amostra -

$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

Os exemplos acima usam funções adicionais do objeto cin, como a função getline () para ler a linha de fora e a função ignore () para ignorar os caracteres extras deixados pela instrução de leitura anterior.

Ponteiros de posição de arquivo

Ambos istream e ostreamfornece funções de membro para reposicionar o ponteiro de posição do arquivo. Essas funções de membro sãoseekg ("buscar obter") para istream e seekp ("buscar colocar") para ostream.

O argumento para seekg e seekp normalmente é um inteiro longo. Um segundo argumento pode ser especificado para indicar a direção da busca. A direção de busca pode serios::beg (o padrão) para posicionamento em relação ao início de um fluxo, ios::cur para posicionamento em relação à posição atual em um fluxo ou ios::end para posicionamento em relação ao final de um fluxo.

O ponteiro de posição do arquivo é um valor inteiro que especifica a localização no arquivo como um número de bytes a partir da localização inicial do arquivo. Alguns exemplos de posicionamento do ponteiro de posição do arquivo "get" são -

// position to the nth byte of fileObject (assumes ios::beg)
fileObject.seekg( n );

// position n bytes forward in fileObject
fileObject.seekg( n, ios::cur );

// position n bytes back from end of fileObject
fileObject.seekg( n, ios::end );

// position at end of fileObject
fileObject.seekg( 0, ios::end );