ファイルのシーク位置定数(ENUM_FILE_POSITION)
ファイルのシーク位置定数(ENUM_FILE_POSITION)は、ファイルのどこからどこまでを読み込むのかを、設定するための定数です。
例えば、ファイルのヘッダー部分を読み飛ばすために、「ファイルの先頭から100文字までは無視する」という設定が可能です。
ファイルのシーク位置定数を使うには、以下の関数を使います。
- FileSeek関数:ファイルのシーク位置を設定する関数
ファイルのシーク位置定数(ENUM_FILE_POSITION)
| 定数 | 説明 |
| SEEK_SET | ファイルの先頭 |
| SEEK_CUR | 現在のファイルのシーク位置 |
| SEEK_END | ファイルの最後 |
ファイルのシーク位置定数の使い方
主に、FileSeek関数で使用されます。
FileSeek関数の第3引数(origin)として、ファイルのシーク位置定数が使用されます。
例えば、以下のように使用します。
void OnInit()
{
//ファイルパスを指定
string path = "folder/data.csv";
//ファイルを読み込み可能・CSV形式で読み込む
int handle = FileOpen(path,FILE_READ|FILE_CSV);
//ファイルの読み込みエラーチェック
if(handle != INVALID_HANDLE)
{
//文字列番号をランダムに選ぶ
ulong ind = MathRand() % 100;
//位置を文字列の始めにシフトする
if(FileSeek(handle, ind, SEEK_SET) == true)
{
//ind 番号で文字列を読んで出力する
PrintFormat("String text with %d number: \"%s\"", ind, FileReadString(handle));
}
//ファイルを閉じる
FileClose(handle);
}
}各定数ごとのサンプルプログラム
SEEK_SET(ファイルの先頭から指定位置へシーク)
SEEK_SETは、ファイルの先頭を基準にしてシーク位置を移動します。以下の例では、ファイルの先頭から50バイト目に移動してから読み込みを行います。
void OnStart()
{
string path = "test_data.bin";
//ファイルをバイナリ形式・読み込みモードで開く
int handle = FileOpen(path, FILE_READ | FILE_BIN);
if(handle != INVALID_HANDLE)
{
//ファイルの先頭から50バイト目にシークする
if(FileSeek(handle, 50, SEEK_SET))
{
//現在のシーク位置を取得して出力
Print("SEEK_SET後の位置: ", FileTell(handle));
//データを読み込む
string data = FileReadString(handle, 10);
Print("読み込んだデータ: ", data);
}
else
{
Print("FileSeek(SEEK_SET)に失敗しました");
}
FileClose(handle);
}
else
{
Print("ファイルオープンに失敗しました: ", GetLastError());
}
}SEEK_CUR(現在位置から相対的にシーク)
SEEK_CURは、現在のシーク位置を基準にして移動します。以下の例では、データを一部読み込んだ後、さらに20バイト先に移動して読み込みを行います。
void OnStart()
{
string path = "test_data.bin";
//ファイルをバイナリ形式・読み込みモードで開く
int handle = FileOpen(path, FILE_READ | FILE_BIN);
if(handle != INVALID_HANDLE)
{
//まず先頭から10バイト読み込む
string firstData = FileReadString(handle, 10);
Print("最初の10バイト: ", firstData);
Print("現在の位置: ", FileTell(handle));
//現在位置からさらに20バイト先にシークする
if(FileSeek(handle, 20, SEEK_CUR))
{
Print("SEEK_CUR後の位置: ", FileTell(handle));
//データを読み込む
string data = FileReadString(handle, 10);
Print("読み込んだデータ: ", data);
}
else
{
Print("FileSeek(SEEK_CUR)に失敗しました");
}
FileClose(handle);
}
else
{
Print("ファイルオープンに失敗しました: ", GetLastError());
}
}SEEK_END(ファイルの末尾を基準にシーク)
SEEK_ENDは、ファイルの末尾を基準にして移動します。以下の例では、ファイルの末尾から30バイト手前に移動して、末尾付近のデータを読み込みます。
void OnStart()
{
string path = "test_data.bin";
//ファイルをバイナリ形式・読み込みモードで開く
int handle = FileOpen(path, FILE_READ | FILE_BIN);
if(handle != INVALID_HANDLE)
{
//ファイルサイズを取得して出力
ulong fileSize = FileSize(handle);
Print("ファイルサイズ: ", fileSize, " バイト");
//ファイルの末尾から30バイト手前にシークする
if(FileSeek(handle, -30, SEEK_END))
{
Print("SEEK_END後の位置: ", FileTell(handle));
//末尾付近のデータを読み込む
string data = FileReadString(handle, 30);
Print("末尾付近のデータ: ", data);
}
else
{
Print("FileSeek(SEEK_END)に失敗しました");
}
FileClose(handle);
}
else
{
Print("ファイルオープンに失敗しました: ", GetLastError());
}
}【補足】ファイルのシーク位置定数の列挙型(ENUM_FILE_POSITION)
ファイルのシーク位置定数は、ENUM_FILE_POSITIONという列挙型に含まれています。
列挙型は、定数群をひとまとめにしたものです。
以下のように使います。
ENUM_FILE_POSITION filePosition = SEEK_SET;上記のようにプログラムすると、filePosition変数に SEEK_SETの値が代入されます。





