Manipulação de arquivos em C++

Neste breve artigo faço uma apresentação do conceito de arquivos, como o sistema operacional os encara, em especial em sistemas Linux e como é sua manipulação em C++, com códigos de exemplo de leitura e/ou gravação dos mesmos.

[ Hits: 132.305 ]

Por: Matheus Santana Lima em 13/11/2008


Exemplo de gravação e leitura - (fstream)



#include <fstream.h>
#include <cstdlib>
#include <stdio.h>
#include <iostream>
using namespace std;
class alunos{
private:
int ra;
char nome[50];
public:
alunos();
void cadastra();
void display();
};
alunos :: alunos(){
ra = 1;
strcpy(nome,"");
}
void alunos :: cadastra(){

      cout << "Digite o RA: " << endl;
      cin >> ra;
      cout << "Digite o nome: "<< endl;
      cin >> nome;
}

void alunos :: display(){

   cout << "Número do RA: " << endl;
   cout<< ra << endl;
   cout << "Nome do aluno: "<< endl;
   cout << nome << endl;
}

int main(){

   int i;

   fstream iodados;
   iodados.open("alunos.txt", ios::ate | ios::out | ios::in);

   alunos cad1;

   cout << "Deseja cadastrar um aluno? Tecle 0(zero) para sair e 1 para confirmar." << endl;
   cin >> i;

   while(i!=0){

      cad1.cadastra();//Lemos os dados com a função 'cadastra()'.
      iodados.write( (char *)&cad1, sizeof(alunos));//Aqui gravamos o conteúdo do objeto 'cad1' em 'alunos.txt'.
//Usamos 'sizeof(alunos)' neste caso, para informar o tamanho do registro e posteriormente grava -lo no arquivo.
      cout << "Deseja cadastrar um aluno? Tecle 0(zero) para sair e 1 para confirmar." << endl;
      cin >> i;
   }

   iodados.seekg(0);

   while (iodados.read( (char *)&cad1, sizeof(alunos)))
      cad1.display();//Imprime na tela o registro.

}

Resultado esperado do código acima [1]:

Deseja cadastrar um aluno? Tecle 0(zero) para sair e 1 para confirmar.
0
Número do RA:
23445
Nome do aluno:
Lais
Número do RA:
767553
Nome do aluno:
Joao Resultado esperado do código acima [2]:

Deseja cadastrar um aluno? Tecle 0(zero) para sair e 1 para confirmar.
1
Digite o RA:
316938
Digite o nome:
Matheus
Deseja cadastrar um aluno? Tecle 0(zero) para sair e 1 para confirmar.
1
Digite o RA:
65734
Digite o nome:
Mary
Deseja cadastrar um aluno? Tecle 0(zero) para sair e 1 para confirmar.
0
Número do RA:
23445
Nome do aluno:
Lais
Número do RA:
767553
Nome do aluno:
Joao
Número do RA:
316938
Nome do aluno:
Matheus
Número do RA:
65734
Nome do aluno:
Mary

Obs.: Em iodados.seekg(0) podemos substituir por iodados.seekg(sizeof(alunos)). Se fizermos iodados.seekg(sizeof(alunos) + sizeof(alunos)), colocamos o arquivo na segunda posição.

No código acima foi necessário colocar iodados.seekg(0), pois depois que adicionamos registros ao arquivo, este chega ao estado de Fim de Arquivo (End of File), colocando 0 (zero), voltamos ao começo do arquivo e depois mostramos na tela os registros armazenados no mesmo.

Em iodados.open("alunos.txt", ios::ate | ios::out | ios::in);, o segundo argumento indica o modo de abertura do arquivo. Abaixo, temos as opções possíveis para abertura (o pipe é usado para combinar as opções):

Modos de aberturaDescrição
ios::inAbre para leitura (default de ifstream).
ios::outAbre para gravação (default de ofstream),
ios::ateAbre e posiciona no final do arquivo.(Este modo trabalha com leitura e gravação)
ios::appGrava a partir do fim do arquivo
ios::truncAbre e apaga todo o conteúdo do arquivo
ios::nocreateErro de abertura se o arquivo não existe
ios::noreplaceErro de abertura se o arquivo existir
ios::binaryAbre em binário (default é texto)


É recomendada a utilização da função <nome_do_objeto_de_dados>.close para fechar o arquivo, depois de manipulá-lo, no final do código. Alguns compiladores podem não aceitar e gerar erros se o arquivo não é fechado.

Fontes:
---
Matheus Santana Lima
[email protected]
http://matheussantanalima.x-br.com/

Página anterior    

Páginas do artigo
   1. O que são arquivos?
   2. Manipulação de arquivos - Como funciona?
   3. O que são as classes iostream e fstream.h
   4. Exemplo de gravação - (ofstream) - Gravando um registro
   5. Exemplo de gravação - (ifstream) - Lendo um registro
   6. Exemplo de gravação - (ofstream) - Gravando vários registros
   7. Exemplo de gravação - (ifstream) - Lendo vários registros
   8. Exemplo de gravação e leitura - (fstream)
Outros artigos deste autor

Apresentando e pondo a prova o Mono

Projeto OLPC - O famoso laptop de $100

Freeduc - Educação escolar é com Linux!

Fazendo montagens com o Gimp

Análise do Mandriva Free 2006 - Conhecendo melhor o sistema

Leitura recomendada

Manipulando arquivos em C (parte 2)

Manipulando arquivos em C (parte 1)

Manipulação de imagens no formato PPM

Inteiros e Strings na linguagem C

Programação com números inteiros gigantes

  
Comentários
[1] Comentário enviado por marcrock em 13/11/2008 - 15:21h

Muito bom cara !!!!
Você foi bem objetivo, mesmo eu sem grandes conhecimentos de C++ entendi tudo !

Até mais .

[2] Comentário enviado por vsenna em 17/11/2008 - 02:25h

Muito bom seu texto, está escrito de forma bem clara!

[]'s

[3] Comentário enviado por andrezc em 11/04/2010 - 19:35h

Há alguns erros. Por exemplo, no primeiro código faltou uma biblioteca, a cstring, para usar a função strcpy(). E você usou bibliotecas da linguagem C, como stdio.h. O correto seria:

#include <cstdio>

mesma coisa com

#include <fstream.h>

o correto seria:

#include <fstream>


André
[]'s

[4] Comentário enviado por [email protected] em 16/06/2011 - 12:36h

como faço um programa em c++ que verifique quais as letras do alfabeto estao faltando em um texto por favome ajude envie para:[email protected]

[5] Comentário enviado por DarthVictor em 26/06/2011 - 13:56h

Muito bom. Apesar de sempre ter usado #include <cstdlib.h>, fprinf, fscanf, etc; em C++. Gosto mais das funções em C e muitos programas tem de ser escritos orientado a objetos.

[6] Comentário enviado por LucianoAlexandre em 15/03/2012 - 07:41h

Legal, muito bom o artigo!!!

[7] Comentário enviado por CiroboyBR em 15/05/2015 - 05:42h

Bem fácil de entender. vlw pelo tuto.


Contribuir com comentário