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: 131.106 ]

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

Visopsys - Sistema Operacional aberto e portátil para manipulação de discos rígidos

Os segredos da criptografia com o Gcipher

Linux, 100% compatível!

Análise do Seamonkey - A evolução da espécie

Gerenciando serviços de sistemas Linux

Leitura recomendada

Manipulando arquivos em C (parte 1)

Manipulação de imagens no formato PPM

Manipulando arquivos em C (parte 2)

Criando uma aplicação gráfica com o Qt Designer

Introdução as Bibliotecas do C/C++

  
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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts