ファイル操作

今回は、ファイルを開き、データを読み込むプログラムを作ります。
そのために関数がいくつか登場します。
今回は以下の関数でやります。関数名をクリックすると詳しい解説。
関数の名前と意味はそんなに難しくないと思います。
関数簡単な説明
fopenファイルをひらきます
freadファイルを読み込みます
fcloseファイルを閉じます
fseekファイルポインタを操作します
ftellファイルポインタの位置を返します

ファイルを読む

サンプルです。
#console
#include<vcrt71.sbp>

Dim fp As *FILE'早速ですが構造体ポインタを宣言します。
Dim fsiz As Long
Dim buf As *Byte

'ファイルhage.txtを開きます
fp = fopen("hage.txt" , "r")
If fp = NULL Then Error()

'ファイルサイズを計算します。
fseek(fp , 0 ,SEEK_END)
fsiz = ftell(fp)
fseek(fp , 0 , SEEK_SET)

'bufにファイルを読み込みます。
buf = malloc(fsiz)
fread(buf , 1 , fsiz , fp)

'読み込んだのでファイルを閉じます。
fclose(fp)

'読み込んだデータを表示します。
printf(Ex"%s\n" , buf)

'最後にメモリを開放しておきます。
free(buf)

Sub Error()
    printf(Ex"エラーが発生しました。\n終了します。\n")
    exit(1)'強制終了する関数(引数0=正常終了、1=以上終了)
End Sub

ファイルに書き込む

今度は書き込みです。読み込みと少し違うだけです。
#console
#include<vcrt71.sbp>

Dim fp As *FILE
Dim buf[100] As Byte

'ファイルhage.txtを開きます("r"が"w"に)
fp = fopen("hage.txt" , "w")
If fp = NULL Then Error()

'bufに書き込む内容をセット。
'100バイトまでなら何でもok
strcpy(buf , Ex"name:ななしさん\ne-mail:sage\nカキコテスト\n")

'書き込む
fwrite(buf , 1 , strlen(buf) , fp)

'ファイルを閉じます。
fclose(fp)

Sub Error()
    printf(Ex"エラーが発生しました。\n終了します。\n")
    exit(1)'強制終了する関数(引数0=正常終了、1=以上終了)
End Sub
ファイル操作はそんなに難しいものではありません。
開いて、読み書きして、閉じるだけです。関数を機械的に使うだけです。
問題はFILE構造体ですが、使う機会はめったに無いと思います。
また、FILE構造体はコンパイラによっても定義が違います。

関数の使い方


fopen:ファイルを開く
fopen (filename As *Byte, mode As *Byte) As *FILE
----
filename:ファイル名
mode:"r"読み込みモード
"w":書き込みモード
"a":追加モード
(bを付けるとバイナリモード,+を付けると読み書きモード)
----
ストリームが戻る。失敗したらNULL。

fclose:ファイルを閉じる
fclose (stream As *FILE) As Long
----
stream:閉じるストリーム
----
成功0、エラーEOF

fread:ファイルから読み込む
fread (ptr As VoidPtr, size As size_t,nobj As size_t ,stream As *FILE) As size_t
----
sizeの大きさのオブジェクトを最大nobj個streamからptrに読み込む。
----
読み込んだデータ数が返る。

fwrite:ファイルに書き込む
fwrite (ptr As VoidPtr, size As size_t,nobj As size_t ,stream As *FILE) As size_t
----
sizeの大きさのオブジェクトを最大nobj個を、ptrからstreamに書き込む。
----
書き込んだデータ数が返る。

fseek:ファイルの位置を設定する
fseek (stream As *FILE, offset As Long, origin As Long) As Long
----
streamのoriginからoffset離れた位置にファイル位置をセットする。
originにはSEEK_SET(始め),SEE_CUR(現在位置),SEEK_END(終わり)を指定することもできる。
テキストファイルのとき(fopenのモードにbが無いとき)、offsetは0、ftellの戻り値にする。
(ftellのとき、originはSEE_SETにする)
----
成功時0、エラーなら0以外が返る。

ftell:現在のファイル位置を返す
ftell (stream As *FILE) As Long
----
streamのファイル位置を返す。
----
エラーなら-1を返す。

おまけ:FILE構造体
Type FILE
  _ptr As *Byte
  _cnt As Long
  _base As *Byte
  _flag As Long
  _file As Long
  _charbuf As Long
  _bufsiz As Long
  _tmpfname As *Byte
End Type