GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Arquivo, alocação e ponteiro

programação
Tags: #<Tag:0x00007fb39d26fe78>

#1

Aparentemente meu código roda limpo, mas queria saber como faço pra ele realmente salvar o arquivo em binário.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct registro{
	string vetNome;
	string vetEstilo;
	string vetInstrumento;
	string vetBanda;
	bool   vetVerifica;
};

char opcoes(){
	char escolha = '0';
	bool verifica = false;
	
	while (escolha < '1' or escolha > '7'){
		if(!verifica){
			cin >> escolha;
				
			verifica = true;
		}
	}
	
	return escolha;
}

void realocar(registro* &vet, int &qtdMaxima, int qtdAtual){
	registro* vetAux = new registro[qtdMaxima];
	
	for(int i = 0; i < qtdAtual; i++){
		vetAux[i] = vet[i];
	}

	qtdMaxima += 2;

	delete[] vet;
	
	vet = new registro[qtdMaxima];

	for(int i = 0; i < qtdAtual; i++){
		vet[i] = vetAux[i];
	}

	delete[] vetAux;
	
	vetAux = NULL;
	
	cout << "memoria ajustada " << qtdMaxima << endl << endl;
}

void incluir(registro* &vet, int &qtdMaxima, int &qtdAtual){
	if (qtdAtual == qtdMaxima){	
		realocar(vet, qtdMaxima, qtdAtual);
	}
	
	cin.ignore();
	
	getline(cin, vet[qtdAtual].vetNome);
	getline(cin, vet[qtdAtual].vetEstilo);
	getline(cin, vet[qtdAtual].vetInstrumento);
	getline(cin, vet[qtdAtual].vetBanda);

	vet[qtdAtual].vetVerifica = true;
	
	qtdAtual++;
}

void excluir(registro *vet, int qtdAtual){
	string palavra;
	bool excluido = false;
	
	cin.ignore();
	
	getline(cin, palavra);
						
	for (int i = 0; i < qtdAtual; i++){
		if((palavra == vet[i].vetNome) and vet[i].vetVerifica and !excluido){
			vet[i].vetVerifica = false;
			excluido = true;
		}
	}		
	if(!excluido){
		cout << "nao existe" << endl;
	}	
}

void listar(registro *vet, int qtdAtual){
	for (int i = 0; i < qtdAtual; i++){
		if(vet[i].vetVerifica){
			cout << vet[i].vetNome         << endl 
				 << vet[i].vetEstilo       << endl
				 << vet[i].vetInstrumento  << endl
				 << vet[i].vetBanda        << endl;
		}
		if(vet[i].vetVerifica){
			cout << endl;
		}
	}
}

void alterar(registro *vet, int qtdAtual){
	string palavra;
	bool alterado = false;
	
	cin.ignore();
	getline(cin, palavra);
						
	for (int i = 0; i < qtdAtual; i++){
		if((palavra == vet[i].vetNome) and vet[i].vetVerifica and !alterado){
			getline(cin, vet[i].vetEstilo);
			getline(cin, vet[i].vetInstrumento);
			getline(cin, vet[i].vetBanda);
						
			alterado = true;
		}
	}		
	if(!alterado){
		cout << "nao existe" << endl;
	}	
}

void salvar(registro* &vet, int qtdAtual){
	ofstream arquivo("data.dat", ios::binary);
	
	char c[1];
	
	int contArquivados = 0;
	
	if(arquivo){
		for(int i = 0; i < qtdAtual; i++){
			if(vet[i].vetVerifica){
				contArquivados++;
				
				int tam = (vet[i].vetNome).size();
				
				for(int k = 0; k < tam; k++){
					c[0] = vet[i].vetNome[k];
					arquivo.write(c, 1);
				}
				
				arquivo.write(" ", 1);
				tam = (vet[i].vetEstilo).size();
				
				for(int k = 0; k < tam; k++){
					c[0] = vet[i].vetEstilo[k];
					arquivo.write(c, 1);
				}
				
				arquivo.write(" ", 1);
				tam = (vet[i].vetInstrumento).size();
				
				for(int k = 0; k < tam; k++){
					c[0] = vet[i].vetInstrumento[k];
					arquivo.write(c, 1);
				}
				
				arquivo.write(" ", 1);
				tam = (vet[i].vetBanda).size();
				
				for(int k = 0; k < tam; k++){
					c[0] = vet[i].vetBanda[k];
					arquivo.write(c, 1);
				}
				
				arquivo.write(" ", 1);
			}
		}
	}
	arquivo.close();
	
	cout << "gravados " << contArquivados << endl;
}

void carregar(registro* &vet, int &qtdMaxima, int &qtdAtual){
	qtdMaxima = 2;
	
	delete[] vet;
	
	vet = new registro[qtdMaxima];
	
	ifstream arquivo("data.dat", ios::binary);
	
	char c[1];
	
	int op = 1;
	
	qtdAtual = 0;
	
	if(arquivo){
		while(!arquivo.eof()){
			arquivo.read(c,1);
			
			if(c[0] == ' '){
				op++;
			} else {
				if(qtdAtual == qtdMaxima){
					realocar(vet, qtdMaxima, qtdAtual);
				}
				switch(op){
					case 1:{
						vet[qtdAtual].vetNome += c[0];
						break;
					}
					case 2:{
						vet[qtdAtual].vetEstilo += c[0];
						break;
					}
					case 3:{
						vet[qtdAtual].vetInstrumento += c[0];
						break;
					}
					case 4:{
						vet[qtdAtual].vetBanda += c[0];
						break;
					}
				}
			}
			if(op == 5){
				op = 1;
				vet[qtdAtual].vetVerifica = true;
				qtdAtual++;
			}
		}
	}
	arquivo.close();
}

int main(){
	int qtdMaxima = 2;
	char opcao;
	int qtdAtual = 0;
	
	registro* vet = new registro[qtdMaxima];
	
	do{		
		opcao = opcoes();
		
		cout << endl;
		
		switch(opcao){			
			case '1':{
				incluir(vet, qtdMaxima, qtdAtual);
				cout << endl;
				break;
			}
			case '2':{
				excluir(vet, qtdAtual);
				cout << endl;
				break;
			}
			case '3':{
				listar(vet, qtdAtual);
				break;
			}
			case '4':{
				alterar(vet, qtdAtual);
				cout << endl;
				break;
			}
			case '5':{
				salvar(vet, qtdAtual);
				cout << endl;
				break;
			}
			case '6':{
				carregar(vet, qtdMaxima, qtdAtual);
				break;
			}
		}
	} while(opcao != '7');
	
	delete[] vet;
	
	vet = NULL;
	
	return 0;
}

Desde já agradeço!