Как читать / записывать объект в файл - PullRequest
2 голосов
/ 19 ноября 2011

Я пытаюсь сохранить содержимое объекта в файл, а затем прочитать их.

У меня есть функции, которые добавляют область, загружают существующую область. Эти функции используют объекты класса Area для сохранения и загрузки идентификатора, имени области и количества узлов в области.

//in the header file
class Area:
{
  public:
  ushort u16ID;
  string sAreaName;
  vector<ushort> nodesList;
};

Как мне записать это в файл, чтобы загружать данные при перезапуске программы (т.е. программа закрывается, а затем снова запускается).

До сих пор у меня было следующее для записи и чтения в файл:

//In my main .cpp file
//Creating output stream. 
std::ostream& operator<<(std::ostream& out, const Area *objArea) {
  out.write(reinterpret_cast<const char*>(objArea->u16ID),sizeof(objArea->u16ID));
  out.write((objArea->sAreaName.c_str()),sizeof(objArea->sAreaName));
  out.write(reinterpret_cast<const char*>(objArea->nodesList),sizeof(objArea->nodesList));
  return out;
}
//Creating input stream.
istream &operator>>( istream &in, AppAreaRecord *objArea){
  ushort id;
  string name;
  string picName;
  vector<ushort> nodes;
  in.read(reinterpret_cast<char*>(objArea->u16RecordID),sizeof(objArea->u16RecordID));
  in.read(reinterpret_cast<char*>(objArea->sAreaName),sizeof(objArea->sAreaName));
  in.read(reinterpret_cast<char*>(objArea->nodesList),sizeof(objArea->nodesList));
  return in;
}

//Function to load the existing data.
void loadAreas(){
 Area *objArea;
 ifstream in("areas.dat", ios::in | ios::binary);
  in >> objArea;}
}

//Function to write the data to file.
void saveAreas() {
  Area *objArea;
  ofstream out("areas.dat", ios::out | ios::binary | ios::app);
  out << objArea;}

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Что-то вроде:

    class Area: {   
   void write(std::ofstream out)    {
           out.write(&u16ID, sizeof(ushort));
           out.write(sAreaName.c_str(), sAreaName.length()+1);
           int ss = nodeList.size();
           out.write(&ss, sizeof(int));
           for (vector<ushort>::iterator it = nodeList.begin(); it != nodeList.end(); it++) {
               out.write(*it, sizeof(ushort));
           }
       } 
 };
0 голосов
/ 19 ноября 2011

Если вы можете позволить себе использовать boost :: serialization , я настоятельно рекомендую это сделать.После того, как вы его настроите, вы можете писать в текстовый, xml, двоичный файлы, он обрабатывает контейнеры STL, иерархии классов, указатели, интеллектуальные указатели и многое другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...