Utilizando o mesmo fluxo de arquivo para gravar e ler em um arquivo os modos de acesso funcionam corretamente, mas quando os fluxos de arquivos são diferente (são abertos e fechados para cada chamada de função) a flag de modo de acesso ate está truncando o conteúdo do arquivo oque não deveria acontecer.
[size=18]Oque está acontecendo? Como abrir o arquivo e modificar um valor sem truncar seu conteúdo?[/size]
[code]/*
- main.cpp
- Created on: 23/08/2011
-
Author: david
*/
#define NOME_DO_ARQUIVO “teste.t”
#include <fstream>
using std::ifstream;
using std::ofstream;
#include <iostream>
using std::cout;
using std::endl;
#include <cstring>
class Obj {
private:
int id;
char value[4];
public:
Obj(int id = -1, char value[] = "null") {
this->id = id;
std::strcpy(this->value, value);
}
virtual ~Obj() {}
int getId() const {
return id;
}
const char * getValue() const {
return value;
}
};
void inicializar () {
ofstream arquivo(NOME_DO_ARQUIVO);
Obj o;
for (int i = 0; i < 3; i++)
arquivo.write(reinterpret_cast<char *>(&o), sizeof(Obj));
}
void inserir(Obj &o) {
ofstream arquivo(NOME_DO_ARQUIVO, std::ios::ate);
arquivo.seekp(o.getId() * sizeof(Obj));
arquivo.write(reinterpret_cast<char *>(&o), sizeof(Obj));
}
void imprimirItem(int id) {
ifstream arquivo(NOME_DO_ARQUIVO);
arquivo.seekg(id * sizeof(Obj));
Obj o;
arquivo.read(reinterpret_cast<char *>(&o), sizeof(Obj));
cout << "id: " << o.getId() << "\nvalue: " << o.getValue() << std::endl;
}
int main() {
inicializar();
Obj o1(0,"aa");
Obj o2(1,"bb");
Obj o3(2,"ccc");
inserir(o3);
inserir(o2);
inserir(o1);
imprimirItem(0);
imprimirItem(1);
imprimirItem(2);
inicializar();
inserir(o1);
inserir(o2);
inserir(o3);
cout << endl;
imprimirItem(0);
imprimirItem(1);
imprimirItem(2);
}
[/code]