概要 | 関数一覧 | サンプルプログラム(tans.c) |
標準 C 関数での読み書き手順 | FSA 関数での読み書き手順 | 説明 |
---|---|---|
#include <stdio.h> #include <fcntl.h> #include <unistd.h> int fd; fd=open(pathname,openmode); read(fd,buf,count); write(fd,buf,count); close(fd); |
/* fsa.h must be included before using FSA API */ #include "fsa.h" FSA_HANDLE h; FsaOpen(&h,pathname, openmode); FsaReadStream(h,i,buf,from,count); FsaWriteStream(h,i,buf,from,count); FsaClose(&h); |
標準 C ライブラリィも FSA も最初に対象ファイルをオープンして処理後にクローズするのは同じです。 標準 C の write() に FSA では FsaWriteStream()、 標準 C の read() に FSA では FsaReadStream() が対応します。 FSA では seek() が無いので、引数に処理開始バイト位置の from を指定する必要があります。 最大の違いは FsaReadStream() と FsaWriteStream() ではストリームのインデックス i を指定していることです。 FSA では 同じファイルに読み書きを実行しても、 i が異なれば全く独立した互いに異なる処理と見なされます。従って、各 i 毎にサイズ(ストリームサイズ)が存在します。 |
標準 C の I/O | FSA の I/O |
---|---|
関数名 | 説明(引数) |
---|---|
FsaOpen(FSA_HANDLE *h,const char* file, const char mode) |
処理対象の FSA ファイルをオープンします。
|
FsaWriteStream(FSA_HANDLE h, U_INT i, void* buff,U_LONG from, U_INT bytes) | ストリームにデータを書き込みます。
|
FsaReadStream (FSA_HANDLE h, U_INT i, void* buff,U_LONG from, U_INT bytes) |
ストリームからデータを読み込みます。
|
FsaClose(FSA_HANDLE* h) | FSAファイルをクローズして処理を終了します。エラーが検出されてもエラーハンドラーは呼ばれません。 |
n は FsaGetMaxStreamCount(h,&m) で取得できます(n=m-1)。また、m は FsaExtendMaxStreamCount(h,M) で自由に拡大できます(最低でも M 個ストリーム数を増やします)。
関数名 | 説明(引数) |
---|---|
FsaGetStreamSize(FSA_HANDLE h, U_INT i, U_LONG* size) | ストリーム i のバイトサイズを size に読み込みます。 |
FsaTrimStream(FSA_HANDLE h, U_INT i, U_LONG from) | ストリーム i のバイトサイズを from にします(from 以降のデータを切り捨てます)。 |
FsaGetMaxStreamCount(FSA_HANDLE h, U_INT *cs) | 現在アクセス可能なストリーム数を cs にセットします。 |
FsaExtendMaxStreamCount(FSA_HANDLE h, U_INT cs) | アクセス可能なストリーム数を最低でも cs 個増やします。 |
FsaSetFsaTag(FSA_HANDLE h, U_LONG tag) | FSAファイルのユーザ固有データ(Tag情報)tag を書き込みます。 |
FsaGetFsaTag(FSA_HANDLE h, U_LONG* tag) | FSAファイルのユーザ固有データ(Tag情報)を tag に読み込みます。 |
FsaSetStreamTag(FSA_HANDLE h, U_INT i, U_LONG tag) | ストリーム i のユーザ固有データ(Tag情報)tag を書き込みます。 |
FsaGetStreamTag(FSA_HANDLE h, U_INT i, U_LONG* tag) | ストリーム i のユーザ固有データ(Tag情報)を tag に読み込みます。 |
FsaSetErrHandler(FSA_HANDLE h, FSA_ERROR_HANDLER f) | エラーハンドラー f をセットします。f が NULL(ゼロ)ならエラーハンドラーの登録を削除します。 |
FsaGetErrHandler(FSA_HANDLE h, FSA_ERROR_HANDLER *f) | セットされているエラーハンドラーを f にセットします。f が NULL(ゼロ)ならエラーハンドラーは登録されていないことを意味します。 |
FsaGetOpenMode(FSA_HANDLE h, char *mode) | FsaOpen()時に指定したオープンモード(大文字)を mode にセットします。 |
int ErrorFunc(
/* All arguments are set by FSA */
FSA_HANDLE handle, /* FSA_HANDLE currently running. */
const char* function, /* FSA function name the error detected */
int fsa_code, /* FSA error code(see fsa.h) that FSA function detected.
(If this is FSA_ERROR_UNDEFINED,then infomations after err_no may be undefined. */
int err_no, /* copy of C system's errno. Use C standard function strerror(err_no) for detail. */
const char* msg, /* The error message that FSA function can describe. */
const char* source_file, /* The source file the error occured. */
int source_line /* The source line the error occured. */
)
{
char ch;
printf(" FSA Error: f=%s code=%d c_er=%d msg=%s file=%s line=%d\n", function, fsa_code, err_no, msg, source_file, source_line);
if(err_no!=0) printf(" c error=%d:%s\n",err_no,strerror(err_no));
printf("Continue or exit (c|e)?");
do {
ch = toupper(getchar());
} while (ch != 'C' && ch != 'E');
if (ch == 'E') {
FsaClose(&handle);
exit(EXIT_FAILURE);
}
return fsa_code;
}