Boa noite.
Estou fazendo um trabalho da faculdade que requer que criemos um sistema que grave várias estruturas lidas da saída padrão em um arquivo binário, levando à necessidade(?) do uso de iteração.
Ao contrário da facilidade que temos nos arquivos de texto, estou tendo problemas na escrita (função InserirDados, não tenho certeza de que está certo) e na leitura (ListaDados):
#include <iostream> #include <fstream> using namespace std; struct PersonagemDesenho {//declarando a estrutura que vai carregar os dados do personagem string nomePersonagem, nomeCriador; string tituloDesenho, relacoesPersonagem; }; void InserirDados () { //variavel para criacao do vetor de registro que sera informado pelo usuario int quantidade; cout << "Quantos personagens voce pretende inserir nesta sessao?" << endl; cin >> quantidade; //criando espaco na memoria para utilizacao de um vetor dinamico PersonagemDesenho* objPersonagem = new PersonagemDesenho[quantidade]; //declarando o fluxo de dados e criando o arquivo em modo de escrita ofstream arquivo ("personagens.dat", ios::binary); //conferir se o arquivo foi criado com sucesso if (!arquivo) { ofstream arquivo ("personagens.dat", ios::binary); } //limpa o buffer do cin cin.ignore (); //como usaremos getline, espacos serao permitidos cout << "(A utilizacao de espacos e' permitida para todos os itens a seguir)" << endl; //descricao das caracteristicas e tudo mais dos personagens for (int i = 0; i < quantidade; i++) { cout << " - PERSONAGEM NUMERO: " << i + 1 << endl; cout << "Digite o nome do personagem a ser inserido" << endl; //getline para pegar o sobrenome e/ou nomes compostos getline(cin, objPersonagem[i].nomePersonagem); cout << "Digite o nome do criador do personagem" << endl; getline(cin, objPersonagem[i].nomeCriador); cout << "Digite o titulo do desenho ao qual o personagem pertence" << endl; getline(cin, objPersonagem[i].tituloDesenho); cout << "Digite personagens relacionados ao personagem principal" << endl; getline(cin, objPersonagem[i].relacoesPersonagem); //CODIGO DE GRAVAÇÃO arquivo.write(reinterpret_cast<const char*> (&objPersonagem[i]), sizeof(PersonagemDesenho)); } cout << "As informacoes serao salvas no arquivo \"personagens.dat\"" << endl; //fechamento do arquivo arquivo.close(); //if conferindo se o arquivo criado corretamente if(arquivo){ cout << "As informacoes foram salvas com sucesso!" << endl; } } void AtualizaDados () { } void BuscaDados () { } void ListaDados () { ifstream arquivo ("personagens.dat", ios::binary); int i = 0; while (???) { arquivo.read(reinterpret_cast<const char*> (&objPersonagens[i]) sizeof(PersonagemDesenho)) i++; } } int main () { char opcaoEscolhida; cout << "Digite o numero referente a opcao que procura" << endl << endl; cout << "Digite \"1\" para inserir dados no sistema" << endl; cout << "Digite \"2\" para atualizar os dados existentes" << endl; cout << "Digite \"3\" para realizar uma busca nos dados salvos" << endl; cout << "Digite \"4\" para listar os dados salvos em ordem alfabetica" << endl; cout << "Pressione qualquer outra tecla para sair do sistema" << endl; cin >> opcaoEscolhida; if (opcaoEscolhida == '1') { InserirDados (); } else if (opcaoEscolhida == '2') { AtualizaDados (); } else if (opcaoEscolhida == '3') { BuscaDados (); } else if (opcaoEscolhida == '4') { ListaDados (); } else { cout << "Valor invalido" << endl; } return 0; }
Ficarei muito agradecido se alguém puder me dar uma mão.