Edited at

C++で文字列など込みのバイナリファイル保存


今日の内容

今までバイナリを触ったことはあったがQtのライブラリで超簡単にやってしまったため、勉強や今後のことを考えて、自分で書いてみた。一見正常に動くが、超やばいプログラム書いてしまった気がしているので、批判超プリーズ。

プログラムの説明をすると、文字列(string)や自作クラスも保存することを前提に、データのサイズを前の方に記録してから、データ自体を保存しています。


問題のコード

#include <iostream>

#include <string>
#include <fstream>

class testdata{
public :
testdata() {};
testdata(int a, int b) {
this->a = a;
this->b = b;
}
int a;
int b;
};

class write {
public :
std::ofstream ofs;
write(std::string filename);
~write() {
ofs.close();
};

void now_write(const char* writedata, size_t size);

};

class read {
public:
std::ifstream ifs;
read(std::string filename);
~read() {
ifs.close();
};

void now_read(void *text);
};

write::write(std::string filename)
{
this->ofs = std::ofstream(filename, std::ios::binary | std::ios::trunc | std::ios::out);
}

void write::now_write(const char* writedata, size_t size)
{
ofs.write((char *)&size, sizeof(size));
ofs.write(writedata,size);
ofs.flush();

std::cout << "output OK" << std::endl;
}

read::read(std::string filename)
{
this->ifs = std::ifstream(filename, std::ios::binary);
}

void read::now_read(void *text)
{
size_t size = 0;
ifs.read((char *)&size,sizeof(size_t));
//std::cout << (int)size << std::endl; //テスト用

ifs.read((char *)text, size);

}

int main()
{
std::string filename = "test.dat";

// データ
testdata a(10, 20);
int b = 11;
std::string c("ABCDEF");

//書き込み
write w(filename);// 開くファイルを決める
w.now_write((const char *)&a, sizeof(a));
w.now_write((const char *)&b, sizeof(b));
w.now_write(c.c_str(),c.size()+1);
w.~write();// 閉じる

//読み込み
read r(filename);// 開くファイルを決める

testdata a2;
r.now_read(&a2);
std::cout << "a2 - a : " << a2.a << std::endl;
std::cout << "a2 - b : " << a2.b << std::endl;

int b2;
r.now_read(&b2);
std::cout << b2 << std::endl;

char c2[255];
r.now_read(c2);
std::cout << c2 << std::endl;

r.~read();// 閉じる
return 0;
}

関数名がゴミな件についてはツッコまないでくれると助かります。