2017年4月27日木曜日

ファイル入出力

ファイル入出力って曲者だと思いませんか?
基本概念は分かっていても
昔どうやってたんだか分からんくなったり
昔の方法が使えなくなっていたり
きちんと調べ治すのも面倒だったりで
取り合えず場当たり的に色んなサイトを参考にして
最初にうまくいった方法をメモしておきます。
(環境はVC++2015でDXライブラリを使っている時)
参考にしたのはこのページとかここ

例を見てもらえば分かると思いますが、おおよそ、はじめC言語的にファイルを開いて
書き込みならfwrite()、読み込みならfread()を使うだけな感じです。
fwrite()の引数は

1:書き込みデータのポインタ
2:書き込みデータのバイトの長さ
3:書き込みデータの数(単数なら1、配列なら複数とか)
4:FILEポインタ
です。
書き込みと読み込みで違いは僅かです。

//-------------------------
//書き込みの例
//-------------------------

// ファイルを開く
FILE* fp;
fopen_s(&fp, "./filename.dat", "wb");//読み込みなら"rb"

//書き込み用の変数を用意
bool b = false;
int n = 9999;
char c = -100;
unsigned char uc = 200;
//構造体もOKだけど内部にポインタ使用してないかは注意
struct Stra
{
float f;
unsigned short us;
};
Stra stra;
stra.f = 3.14;
stra.us = 12345;

std::string st = "aiuあいう文字2017";
size_t stSize = st.size() + 1; //文字列のサイズも記録しておく(終端文字用に+1する)

//変数の書き込み
fwrite(&b, sizeof(b), 1, fp);
fwrite(&n, sizeof(n), 1, fp);
fwrite(&c, sizeof(c), 1, fp);
fwrite(&uc, sizeof(uc), 1, fp);
//構造体の書き込み
fwrite(&stra, sizeof(stra), 1, fp);
//テキストの書き込み
fwrite(&stSize, sizeof(size_t), 1, fp);//テキストchar(バイト)の数
fwrite(st.c_str(), sizeof(char), stSize, fp);//テキスト本体

// ファイルを閉じる
fclose(fp);


//------------------------
//読み込みの例
//------------------------

// ファイルを開く
FILE* fp;
// 読み込みでオープン
fopen_s(&fp, "./filename.dat", "rb");

//読み込み用の変数を用意
bool b;
int n;
char c;
unsigned char uc;
struct Stra
{
float f;
unsigned short us;
};
Stra stra;

//変数の読み込み
fread(&b, sizeof(b), 1, fp);
fread(&n, sizeof(n), 1, fp);
fread(&c, sizeof(c), 1, fp);
fread(&uc, sizeof(uc), 1, fp);
//構造体の読み込み
fread(&stra, sizeof(stra), 1, fp);
//テキストの読み込み
size_t stSize;
fread(&stSize, sizeof(size_t), 1, fp);//サイズ受け取り
 char *cTex = new char[stSize];//テキスト受け取り
fread(cTex, sizeof(char), stSize, fp);
std::string st = cTex; //stringに格納
delete[]cTex;
// ファイルを閉じる
fclose(fp);
-------------------------------
std::stringに直接文字列を読み込む方法もあるかもですが
とりあえずchar配列で受け取ってみました。