#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 abertura | Descrição |
ios::in | Abre para leitura (default de ifstream). |
ios::out | Abre para gravação (default de ofstream), |
ios::ate | Abre e posiciona no final do arquivo.(Este modo trabalha com leitura e gravação) |
ios::app | Grava a partir do fim do arquivo |
ios::trunc | Abre e apaga todo o conteúdo do arquivo |
ios::nocreate | Erro de abertura se o arquivo não existe |
ios::noreplace | Erro de abertura se o arquivo existir |
ios::binary | Abre 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
matheusslima@yahoo.com.br
http://matheussantanalima.x-br.com/