ページへ戻る

+ Links

 印刷 

hideyosi​/hijk​/ファイル入出力 のバックアップの現在との差分(No.2) :: OSASK計画

osaskwiki:hideyosi/hijk/ファイル入出力 のバックアップの現在との差分(No.2)

« Prev  Next »
2: 2010-02-01 (月) 23:12:25 lina ソース 現: 2024-01-08 (月) 12:58:58 lina ソース
Line 8: Line 8:
これがソース。 これがソース。
 #include <guigui01.h>  #include <guigui01.h>
 + 
 void G01Main()  void G01Main()
 {  {
Line 15: Line 15:
  };   };
  int i, j;   int i, j;
 + 
  g01_setcmdlin(cmdlin);   g01_setcmdlin(cmdlin);
  g01_getcmdlin_fopen_s_3_5(1);   g01_getcmdlin_fopen_s_3_5(1);
Line 54: Line 54:
       int pathlen = 8;        int pathlen = 8;
 //          パスの長さってことでいいのかな。test.txtだから、8でいいのかな。  //          パスの長さってことでいいのかな。test.txtだから、8でいいのかな。
 + 
       static unsigned char path[] = { 't','e','s','t','.','t','x','t' };        static unsigned char path[] = { 't','e','s','t','.','t','x','t' };
 //          パス。カレントにあるのでファイル名だけでいいはず・・・  //          パス。カレントにあるのでファイル名だけでいいはず・・・
 + 
       jg01_fopen(mode, slot, pathlen, path);        jg01_fopen(mode, slot, pathlen, path);
 //          ファイルをオープンしてみる  //          ファイルをオープンしてみる
 + 
       if( slot == -1 ) {        if( slot == -1 ) {
               g01_putc('x') ;                g01_putc('x') ;
               return;                return;
       }        }
 + 
       g01_putc('O') ;        g01_putc('O') ;
       return;        return;
Line 89: Line 89:
げげげ! ↑のcpycのソースでは、なんか違う関数使ってる上に引数が2個・・・それに戻り値があるぞ? なんだべこれ??? げげげ! ↑の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系
 +--読み込んだものを文字として扱わない。いうなれば、''そのまんまのバイナリ''で扱う感じ。
 +--このため読んだデータなのか、元々バッファに入ってたデータなのかが区別できないので、''戻り値''を持っている。
 +--戻り値に読み込んだデータのバイト数が入る。
 +--「読んだデータだけを取り出したい」って場合は、自分でバイト数を元にバッファから大きさを指定して取り出さないとデータが狂うことになる
 +
 +
 +
 +*書いてみよう! [#ab20bf06]
 +読めたんだから書いてもみようってなもんで!
 +
 +まず、当然だが、ファイルをオープンしないといけない。書けるようにファイルを開けるには・・・
 +
 +     int mode; mode = 1;
 + //          いっけね・・・Cでは2進数表記ないんだっけ。
 + //                            00000000000000000000000000011001
 + //        ???                  1              1        001
 + //                          新規モード?    書くよ  とりあえず1
 +
 +これでオープンしてあげればいいと!
 +
 +そんでもって書いてみる。・・・例によってguigui01.hとニラメっこ・・・なるほどなるほど・・・・
 +     mode = 0x19;
 +     slot = 5;
 +     path = "newfile.txt";
 +     char *hiyohiyo; hiyohiyo = "hiyokogumo! hiyohiyo ho---!";
 + //          いっけね・・・Cでは2進数表記ないんだっけ。
 + //                            00000000000000000000000000011001
 + //        ???                  1              1        001
 + //                          新規モード?    書くよ  とりあえず1
 + 
 +     jg01_fopen(mode, slot,  path);
 +     jg01_fwrite0f_5(hiyohiyo);
 +
 +これでメイクして走らせて・・・・って! 書けた!!!
 +
 +うおぉぉぉ!!! %%パコかわゆす%% 書き込めたぞおぉぉ!!!
« Prev  Next »