gRoOvE 0 Denunciar post Postado Novembro 4, 2010 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
quitZAUMMM 18 Denunciar post Postado Novembro 4, 2010 Bom, explique melhor, n entendi bem oq qr. []s Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Novembro 4, 2010 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
quitZAUMMM 18 Denunciar post Postado Novembro 4, 2010 struct é uma boa.. veja sobre o map tbm.. []s Compartilhar este post Link para o post Compartilhar em outros sites
gRoOvE 0 Denunciar post Postado Novembro 4, 2010 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
quitZAUMMM 18 Denunciar post Postado Novembro 8, 2010 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
gRoOvE 0 Denunciar post Postado Novembro 10, 2010 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
gRoOvE 0 Denunciar post Postado Novembro 12, 2010 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
quitZAUMMM 18 Denunciar post Postado Novembro 12, 2010 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