fseek() - fseeko() — ファイル位置の位置変更
形式
#include <stdio.h>
int fseek(FILE *stream, long int offset, int origin);
int fseeko(FILE *stream, off_t offset, int origin);言語レベル
ANSI
スレッド・セーフ
はい
統合ファイル・システム・インターフェース
コンパイル・コマンドで SYSIFCOPT(*NOIFSIO) が指定されている場合、fseeko() 関数は使用できません。
説明
fseek() 関数と fseeko() 関数は、 stream に関連付けられている現在のファイル位置を、ファイル内の新しい位置に変更します。 stream での次の操作は、新しい位置で行われます。 更新用にオープ
ンされた stream では、次の操作は読み取り、または書き込み操作のいず
れかです。
fseeko() 関数は、オフセット引数が型 off_t である点を除き、fseek() と同じです。
原点 は、<stdio.h> で定義されている以下の定数のいずれかでなければなりません。
- 原点
- 定義
- SEEK_SET
- ファイルの始め
- SEEK_CUR
- ファイル・ポインターの現在位置
- SEEK_END
- ファイルの終わり
バイナリー・ストリームでは、ファイルの終わりを越えて位置を変更することもできます。 ファイルの先頭よりも前に位置指定しようとすると、エラーが生じます。 正常に実行された場合、
fseek() 関数または fseeko() 関数は、 origin が SEEK_ENDであっても、ファイルの終わり標識をクリアし、先行する ungetc() 関数の同じストリームへの影響を取り消します。注: テキスト・モードで開かれたストリームの場合、
fseek() 関数と fseeko() 関数は使用が制限されています。これは、一部のシステム変換 (復帰改行と改行の間の変換など) で予期しない結果が生じる可能性があるためです。 テキスト・モードでオープンされたストリームを処理するために依存できる唯一の fseek() および fseeko() 操作は、起点値のいずれかに対してゼロのオフセットを持つシーク、または ftell() 関数または ftello() 関数の呼び出しから戻されたオフセット値を持つファイルの先頭からシークするシークです。 ftell() 関数および ftello() 関数の呼び出しは、それぞれの制約事項に従います。戻り値
fseek() または fseeko() 関数は、ポインターを正常に移動すると 0 を戻します。 ゼロ以外の戻り値はエラーを示します。 端末やプリンターのような、シークできないデバイスでは、戻り値はゼロ以外の値です。
errno の値は、次のいずれかに設定されます。
- 値
- 意味
- EBADF
- ファイル・ポインターまたは記述子が無効です。
- EBADSEEK
- シーク操作のオフセットが無効です。
- ENODEV
- 誤ったデバイスに対して操作が試行されました。
- ENOTOPEN
- ファイルはオープンされていません。
- ERECIO
- ファイルはレコードの入出力用にオープンしています。
- ESTDERR
stderrをオープンできません。- ESTDIN
stdinをオープンできません。- ESTDOUT
stdoutをオープンできません。- EIOERROR
- 回復不能入出力エラーが起こりました。
- EIORECERR
- 回復可能入出力エラーが起こりました。
fseek() 関数と fseeko() 関数は、 type=recordでオープンされたファイルではサポートされません。
例
次の例は読み取り用にファイル myfile をオープンします。 入力操作の実行後、
fseek() はファイル・ポインターをファイルの先頭に移動します。#include <stdio.h>
#define MAX_LEN 10
int main(void)
{
FILE *stream;
char buffer[MAX_LEN + 1];
int result;
int i;
char ch;
stream = fopen("mylib/myfile", "r");
for (i = 0; (i < (sizeof(buffer)-1) &&
((ch = fgetc(stream)) != EOF) && (ch != '\n')); i++)
buffer[i] = ch;
result = fseek(stream, 0L, SEEK_SET); /* moves the pointer to the */
/* beginning of the file */
if (result == 0)
printf("Pointer successfully moved to the beginning of the file.\n");
else
printf("Failed moving pointer to the beginning of the file.\n");
}