*.g01のファイル入出力 [#tf1d4cb6] 解説読んだけど、どーもわからないのでもう面倒なので体当たりで実験してみっべぇってなページw cpycのソースを参考に。 *cpycの検証 [#k98db253] これがソース。 #include <guigui01.h> void G01Main() { static unsigned char cmdlin[] = { 0x86, 0x50, 0x8a, 0x8c, 0x40 }; int i, j; g01_setcmdlin(cmdlin); g01_getcmdlin_fopen_s_3_5(1); for (j = 0;; j++) { if (g01_getcmdlin_fopen_m_0_4(0, j) == 0) break; do { i = jg01_fread1_4(2 * 1024 * 1024, g01_bss1a1); jg01_fwrite1f_5(i, g01_bss1a1); } while (i != 0); } return; } ・・・どうも、ファイルのオープンとコマンドラインはセットになってるようだぞ??? うーん。これはちょっと後回し。とにかく、決まりきったファイルをオープンしてみたいな。 *決まりきったファイルを開いてみる [#t183da46] こんなファイルを用意。名前はtest.txt arusyuno kan yo! kokorono hirameki yo. onnnanoko ni ha nanntonaku wakarunoyo! [[ここ>http://osask.net/w/201.html#z2492927]]によると、こんなコードになるのかな・・・ #include <guigui01.h> void G01Main() { int mode; mode = 1; // いっけね・・・Cでは2進数表記ないんだっけ。 // 00000000000000000000000000000001 // ??? 00 0 001 // 書かないので 書かない とりあえず1 int slot = 4; // スロットってなんだべか?あらかじめ用意されたファイルハンドルってことでいい? int pathlen = 8; // パスの長さってことでいいのかな。test.txtだから、8でいいのかな。 static unsigned char path[] = { 't','e','s','t','.','t','x','t' }; // パス。カレントにあるのでファイル名だけでいいはず・・・ jg01_fopen(mode, slot, pathlen, path); // ファイルをオープンしてみる if( slot == -1 ) { g01_putc('x') ; return; } g01_putc('O') ; return; // スロットが-1なら失敗。x(バツ)を表示して終了。そうでなければOを表示 } なーーーんでだよクッソぉ! jg01_fopenが使えないとか言われるぞ?? ヘンダナァ・・・guigui01.h見ると、jg01_fopenはちゃんとあるんだけど、引数が3つしかないぞ?pathlenが廃止された??? うーん・・・pathlenを引っこ抜いたらとりあえずコンパイルは通ったけど、オープンに失敗するなぁ・・・ pathlenが廃止された? ってことは、パス文字列に終端が必要なのかなってんで、お尻に0を置いてみたけど変わらないなぁ・・・ がーーん! ウッチャンがアドバイスくれた! そうだよ! 大勘違いしてた!!!!! よーし! とりあえず O が表示されたぞおぉぉ! ウッチャン大感謝! (まーだポインタが怪しいとは。オイラってばもう!) **読めるかな?? [#r3339d06] うーん。jg01_freadなんだが、これも引数が変更されているっぽいなぁ。guigui01.hに従おう・・・ jg01_fread1(int s, int n, void *b) こういう構文だが、先頭のsはスロットらしいので4でいいか。第二引数と第三引数はなんだろ??これ??? げげげ! ↑のcpycのソースでは、なんか違う関数使ってる上に引数が2個・・・それに戻り値があるぞ? なんだべこれ??? **わーかってきたぞぉぉwww [#jcbd4055] [[ここ>http://osask.net/w/346.html]]に詳しく書いてあった~♪ -まずは、g01_bss1a1。 --これはいわばmallocの簡易版みたいな位置づけらしい。とにかくこれを書けば、2MBのメモリをくれるというわけ。 --なので、別にこれを使わずにmallocを使ってもかまわないはず。たぶん2MB確保とかって頻度が高いので''お便利命令''的に搭載されてるんだろう。 -次。jg01_fread0_4(2 * 1024 * 1024, バッファ); --これも同じくお便利命令と解釈できる。jg01_fread0 でピンで読んでも別にかまわないが、ファイル一個を開くなんてパターンが多いので大抵スロット4が使われる。なので、スロット4を一発で読むっていう命令。第一引数には最大読み込み量を指定するのだろう。とにかくこうしておけば、上限を2MBとしてバッファに内容を読み込み、バッファの終端に0とひっつけてくれると。 さてそんなわけで。こういう風に改良してと・・・ #include <guigui01.h> void G01Main() { int mode; mode = 1; // ??? 00 0 001 // 書かないので 書かない とりあえず1 int slot = 4; // スロットってなんだべか?あらかじめ用意されたファイルハンドルってことでいい? char *path; path = "test.txt"; // パス。カレントにあるのでファイル名だけでいいはず・・・ jg01_fopen(mode, slot, path); // ファイルをオープンしてみる if( slot == -1 ) { g01_putc('x') ; return; } char *buffer = g01_bss1a1; // 2Mのバッファを確保してと・・・ jg01_fread0_4(2 * 1024 * 1024, buffer); /* 2*1024*1024でちょうど2MB */ // バッファが2MBなので、上限2MBで読み込んでおくれ! g01_putstr0(buffer); // バッファの内容を文字列として表示してみて! g01_putc('O') ; return; } うおぉぉ!! きたぞぉぉ!!!! よーし! 任せたぞアンジェ!!! **エラー処理 [#wd7ca2d1] ちなみに、上の、ファイルが開けなかった場合の処理は大間違いでございまする・・・orz・・・ うーん・・・fopenの段階での「ファイル開けなかったよ!」って場合の処理がわからんなぁ。もしかして、意図的に省いている?? jg01_freadには二種類あって、末尾に0が付くか1が付くかで性質が変化するのでこれで判定するのかな??? -jg01_fread0系 --読み込んだものを文字列的にあつかう。''戻り値がないので書くとエラーになる。'' --読み込んだデータのオケツに0(文字列終端判定コード?)を自動で付けてくれる。 --たとえば1000のバッファを用意。読み込んだら、「neko」だけしかないファイルだった。(4文字しか必要ない) --バッファ全体は相変わらず1000あるが、内部では、 'n','e','k','o',0x00,・・・ こういう状態になる。 --なので、普通にg01_putstr0すれば「neko」だけ表示し、5バイト目で終わりだと判断して終了する・・・と。こゆわけ! -jg01_fread1系 --読み込んだものを文字として扱わない。いうなれば、''そのまんまのバイナリ''で扱う感じ。 --このため読んだデータなのか、元々バッファに入ってたデータなのかが区別できないので、''戻り値''を持っている。 --戻り値に読み込んだデータのバイト数が入る。 --「読んだデータだけを取り出したい」って場合は、自分でバイト数を元にバッファから大きさを指定して取り出さないとデータが狂うことになる