次は実際にファイルを読み書きする。
ファイルは、何も指定しないとどこに読み書きされるかというと、現在実行した環境のカレントディレクトリである。
(だから、とりあえずカレントディレクトリのややこしさを確認したんだね!)
次に、ファイルには大きな枠で分類して2種類のファイルがありそれぞれ扱いが違ったり違わなかったりします。(どっちやねん)
これももうどっかで習ったかな?
バイナリファイルは、ちゃんと書けているかどうか確認するときちょっとめんどいので、テキストエディタで開くと中身が文字で見える方(テキストファイル)の読み書きをやってみよう。
まずは、書き込みからやるよ。
手順は前に説明したとおり、ファイルオープン⇒好きに書き込み⇒クローズである。
ファイルの読み書きにはfstreamヘッダをincludeして、読み込みにはifstream、書き込みにはofstreamというストリームを使います。(cinとcoutみたいなもんですね)
# include <Siv3D.hpp> #include <filesystem> #include <fstream> using std::string; using std::ofstream; using std::cout; using std::endl; void Main() { //カレントディレクトリ取得 std::filesystem::path crrpath = std::filesystem::current_path(); Font font{ 30 }; ofstream out_file;//ファイルストリームのインスタンスを作成 string fname = "output.txt"; //書き込み用ファイル名を指定(好きな名前でいいよ) out_file.open(fname, std::ios::out);//ストリームがオープンする //oFileNameのファイル名のファイルを、上書きモードでオープン if (out_file.fail()) { Console.open(); std::cout << "ファイルオープンに失敗しました!" << std::endl; exit(0); } //書き込み部分 int idata = 10; //書き込み用データ char cdata = 's'; //書き込み用データ float fdata = 3.14; //書き込み用データ string str = "Hi! I'm very very happy today.";//書き込み用データ out_file << str << endl;//ストリームにデータを流す out_file << idata << "," << cdata << "," << fdata << endl; out_file << crrpath.string() << endl; out_file.close();//ストリームを閉じる while (System::Update()) { font(ファイルパスをUTF-32にごにょごにょ).draw(Vec2{ 10,Scene::Center().y }, Palette::White); } }
ソースを見るとわかるが、書き込みはcoutでいろいろ表示するときとほとんど同じ感覚である。
いろいろな、ストリームを使うことで、同じような命令でいろいろなことができるのがC++のいいところでもありわかりづらいところでもあるよね。
coutでこう表示するにはどうしたらいいかな?と考えたものをそのまま、ファイルに書き込むことができる。(ので、是非まずはcoutによる出力をマスターしてほしい)