Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gRoOvE

Operação com arquivos C++

Recommended Posts

Tenho que fazer um programa que permita realizar operações com arquivos: ler, gravar, exlcuir e alterar.

Gostaria de dicas de como organizar isso pra facilitar todo o serviço, serão apenas duas palavras guardadas no arquivo.

Será um programa de glossário, estou fazendo assim:

termo:significado

Usarei o dois pontos para me achar dentro do arquivo, porém está um pouco complicado dessa forma, hehe.

Se puderem me dar umas dicas, agradeço :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, explique melhor, n entendi bem oq qr.

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Preciso usar operações com arquivos, no programa vou utilizar apenas duas palavras, termo e significado, como falei é um sistema de glossário.

Qual a melhor forma de armazenar isto no arquivo para recuperar depois? Usar structs? Estou usando a formatação como informei acima: "termo:significado".

Consegui fazer a gravação e leitura no arquivo, porém estou com dificuldades em excluir os registros, estou usando o método nomeObjeto.seekp() para colocar o ponteiro na posição que desejo excluir porém não está funcionando. Segue o código:

 

void excluirTermo() { 
 int qtd=0, indice, cnt=0; 
 char linha[100]; 
 char ch; 
 ifstream leitura; 
 fstream escrita; 
 leitura.open("dadosGlossario.txt"); 
 while (leitura.getline(linha, 100)) { 
 	cout << "|" << qtd << "." << linha << "\t\t\n"; 
 	qtd++; 
 } 
 cout << "|-----------------------------------------------\n"; 
 leitura.close(); 
 cout << "Entre com indice do registro que deseja excluir: \n"; 
 cin >> indice; 
 escrita.open("dadosGlossario.txt", ios_base::in | ios_base::app); 
 escrita.seekp(0); 
 escrita << "teste"; 
 escrita.close(); 
} 
Neste exemplo, tentei escrever a palavra "teste" na posição 0byte do arquivo, só para testar, porém a string é inserida no final do arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

struct é uma boa..

veja sobre o map tbm..

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas pelo que pude perceber, se usar uma struct pra salvar no arquivo, ele vai ficar com o mesmo tamanho se eu salvar apenas uma palavra, como fica no arquivo isso? E pra recuperar depois?

Tem idéia do que pode estar acontecendo no meu código que o ponteiro não vai pra onde quero?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posta seu código inteiro pra eu dar uma olhada fica + facil, da gente te ajudar.

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

quit consegui fazer bastante coisa já, passei a usar structs e lógicamente arquivos binários. Estou tendo problemas em incluir registros no arquivo, sempre que incluo um novo registro, o arquivo é apagado. Dá uma olhada na função de cadastro, não sei o que pode estar errado. Segue o código:

 

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

struct registro {
	int id;
	char termo[50];
	char sig[50];
};

void menu();
void inicializarArquivoDados();
void cadastrarTermo();
void alterarTermo();
void excluirTermo();
void exibirTermo();

int main () {
	int i, opcao;
	menu();
	do {
		cout << "Entre com uma opcao: ";
		cin >> opcao;;
		cout << endl;

		switch (opcao) {
			case 0:
				system("clear");
				menu();
				inicializarArquivoDados();
			break;
			case 1:
				system("clear");
				menu();
				cadastrarTermo();
			break;
			case 2:
				system("clear");
				alterarTermo();
				break;
			case 3:
				system("clear");
				menu();
				excluirTermo();
				break;
			case 4:
				system("clear");
				menu();
				exibirTermo();
				break;
			case 5:
				cout << "S A I N D O ...\n";
				break;
			default:
				system("clear");
				menu();
				cout << "Opcao invalida! Utilize menu.\n";
		}
	} while (opcao != 5);
	return 0;
}
//*********************************************************************************
void menu() {
	cout << "|===============================================|\n";
	cout << "|\t\tSISTEMA GLOSSARIO v1.0\t\t|\n";
	cout << "|===============================================|\n";
	cout << "|0 - Criar arquivo de dados vazio\t\t|\n";
	cout << "|1 - Cadastrar termo/significado\t\t|\n";
	cout << "|2 - Alterar termo/significado\t\t\t|\n";
	cout << "|3 - Excluir termo/significado\t\t\t|\n";
	cout << "|4 - Consultar termo/significado\t\t|\n";
	cout << "|5 - Sair\t\t\t\t\t|\n";
	cout << "|-----------------------------------------------|\n";
}
//*********************************************************************************
void inicializarArquivoDados() { // cria arquivo, inicializando 100 registros vazios
	struct registro inicializarVazio = {0,"",""}; // variavel auxiliar
	ofstream arquivo; // define objeto para escrita no arquivo
	arquivo.open("dadosGlossario.dat"); // abre arquivo para escrita
	
	if (!arquivo) { // verifica se nao ha erro na abertura do arquivo
		cerr << "Arquivo nao pode ser aberto para gravacao!" << endl;
		exit(1);	
	}
	
	for (int i=0; i<100; i++) { // grava no arquivo 100 registros vazioz para realizar controle dos mesmos
		arquivo.write((char*)&inicializarVazio, sizeof(struct registro) );
	}
}
//*********************************************************************************
void cadastrarTermo() {
	struct registro reg;
	ofstream arquivo;
	arquivo.open("dadosGlossario.dat", ios::ate); // definindo objeto para gravacao arquivo
	
	if (!arquivo) { // verifica se o arquivo existe/nome incorreto
		cerr << "Arquivo nao pode ser aberto para gravacao!" << endl;
		return;
	}

	cout << "|ID: ";
	cin.get();
	cin >> reg.id;
	
	cout << "|Termo: ";
	cin.get();
	cin.getline(reg.termo, 50);
	
	cout << "|Significado: ";
	cin.getline(reg.sig, 50);
	
	arquivo.seekp((reg.id-1) * sizeof(struct registro));
	arquivo.write((char*)®,(sizeof(struct registro)));
	cout << "|-----------------------------------------------\n";


	arquivo.close();
}
//*********************************************************************************
void alterarTermo() {
	cout << "alterar termo/sig\n";
}
//*********************************************************************************
void excluirTermo() {

}
//*********************************************************************************
void exibirTermo() {
	struct registro reg;
	ifstream leitura;
	leitura.open("dadosGlossario.dat"); // abre arquivo para leitura
	
	if (!leitura) { // verifica se o arquivo existe/nome correto
		cerr << "Arquivo nao pode ser aberto para leitura!" << endl;
		return;
	}
	
	cout << "|ID\t" << "|TERMO\t\t" << "|SIGNIFICADO\t\t|" << endl;
	cout << "|-----------------------------------------------|" << endl;
	leitura.seekg(0);
	leitura.read((char*)®, sizeof(struct registro));
	while ((leitura) && (!leitura.eof())) { // varre o arquvo binario e armazena cada registro(struct) na variavel reg e exibe na tela ate encontrar eof
		cout << "|" << reg.id << "\t" << reg.termo << "\t\t" << reg.sig << "\t\t" << endl;
		leitura.read((char*)®, sizeof(struct registro));
	}
	cout << "|-----------------------------------------------\n";
	leitura.close(); // fecha arquivo
}
//*********************************************************************************

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver, o problema estava na função cadastrarTermo(), nesta linha:

 

ofstream arquivo;
arquivo.open("dadosGlossario.dat", ios::ate); // definindo objeto para gravacao arquivo

Para escrever em qualquer posição dentro do arquivo, o mesmo deve ser aberto com a stream leitura/gravação:

fstream arquivo;
arquivo.open("dadosGlossario.dat"); // definindo objeto para gravacao arquivo

Me bati um monte, mas agora está resolvido :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa que bom que conseguiw ;D

fiquei meio off no fórum uns dias =//

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.