paulo1205
(usa Ubuntu)
Enviado em 16/11/2016 - 12:40h
uNclear escreveu:
Você fala que eu tenho q passar o arquivo por parametro sempre e ficar retornando ele? Eu n posso simplismente declarar outro em outra função com o msm nome? Dei umas modificadas e ficou assim, so a impressao que nao esta completa e o cabecalho nao esta sendo inserido corretamente no inicio.
void personagem::inserir(){
static int cabecalho = 0;
ofstream arquivo("warcraft.bat", ios::binary | ios::app);
Essa linha aí em cima é que não existia.
No primeiro programa, você tinha colocado apenas “
ofstream arquivo;”, o que criava um objeto do tipo
std::ofstream mas não o ligava a nenhum arquivo. Essa ligação poderia ser feita posteriormente através da função-membro
open(), mas você só chamava tal função depois de tentar -- e falhar, pelo fato de não haver arquivo ligado ao objeto -- duas operações que fariam a gravação do cabeçalho.
Do jeito como você fez agora, o objeto já é criado com uma ligação ao arquivo, pois você já especifica tal ligação no construtor do objeto.
Contudo, você abriu o arquivo com o modo
append. Desse jeito, você força
todas as operações de escrita a serem realizadas no fim do arquivo. Qualquer conteúdo anterior será preservado, e mesmo que você mova o ponteiro de gravação explicitamente, através da função-membro
seekp(), o atributo
append obrigará as gravações a ocorrerem no final (como se houvesse um
seekp(0, ios_base::end); implícito antes de cada operação de escrita).
if (!arquivo){
cout << "O arquivo nao existia, foi necessario cria-lo" << endl;
criarArquivo("warcraft.bat");
O que quer que a função
criarArquivo faça, mesmo que seja bem sucedido, não afetará o objeto local
arquivo. Em particular, agora que você forçou a haver uma ligação entre o objeto e um arquivo de fato, o programa só vai entrar neste pedaço do código se a criação do objeto, que inclui a associação ao arquivo, tiver falhado. Como, porém, a função
criarArquivo() não mexe no objeto local
arquivo, tal objeto continuará dissociado de qualquer arquivo real em disco e, desse modo, todas as operações que vierem abaixo serão inválidas.
}
cabecalho++;
cout << "cabecalho :" << cabecalho << endl;
arquivo.write((char *)this, sizeof(personagem));
A gravação acima será feita ao final do arquivo.
arquivo.seekp(0);
arquivo.write((char*)(&cabecalho), sizeof(int));
E esta gravação aqui também será feita ao final do arquivo.