ftell、_ftelli64
更新 : 2007 年 11 月
ファイル ポインタの現在位置を取得します。
long ftell(
FILE *stream
);
__int64 _ftelli64(
FILE *stream
);
パラメータ
- stream
対象の FILE 構造体。
戻り値
ftell および _ftelli64 は、現在のファイル位置を返します。テキスト モードで開いたストリームでは、復帰と改行の変換が行われるため、ftell および _ftelli64 の戻り値は物理的なバイト オフセットを表さない場合があります。正しいファイルの位置を返すには、ftell と一緒に fseek を使用するか、_ftelli64 と一緒に _fseeki64 を使用してください。エラーが発生した場合、「パラメータの検証」に説明されているように、ftell および _ftelli64 は無効なパラメータ ハンドラを呼び出します。実行の継続が許可された場合、これらの関数は –1L を返し、errno を、ERRNO.H に定義された 2 つの定数のいずれかに設定します。EBADF 定数は、stream 引数が有効なファイル ポインタではないか、開かれているファイルを参照しないことを意味します。EINVAL 定数は、無効な stream 引数が関数に渡されたことを意味します。端末やプリンタなど、シークできないデバイスの場合、または stream が開いているファイルを参照しない場合、戻り値は未定義です。
戻り値の詳細については、「_doserrno、errno、_sys_errlist、および _sys_nerr」を参照してください。
解説
ftell 関数および _ftelli64 関数は、stream に関連付けられたファイル ポインタがある場合に、ポインタの現在位置を取得します。現在位置は、ストリームの先頭からのオフセットで表されます。
ファイルを追加モードで開くと、現在のファイル位置は次の書き込みが行われる場所ではなく、前の I/O 操作が行われた場所になります。たとえば、ファイルを追加モードで開き、前の操作が読み出しだった場合、ファイル位置は次の書き込み開始位置ではなく、次の読み出し開始位置になります。ファイルを追加モードで開いた場合、書き込み操作が行われる前に、ファイル位置はファイルの終端に移動します。追加モードで開いたファイルで I/O 操作がまだ行われていない場合、ファイル位置はファイルの先頭になります。
テキスト モードでは、Ctrl + Z は入力時に EOF (EOF: end-of-file) 文字として解釈されます。読み出しおよび書き込み両用のモードで開かれたファイルでは、fopen および関連ルーチンがすべてファイル末尾の Ctrl + Z の有無を調べ、削除できる場合は削除します。この処理が行われる理由は、Ctrl + Z で終わるファイル内を ftell と fseek の組み合わせまたは _ftelli64 と _fseeki64 の組み合わせで移動すると、ファイルの終端付近で ftell または _ftelli64 が正しく動作しないことがあるためです。
この関数は実行中に呼び出し元スレッドをロックするため、スレッド セーフになります。ロックされないバージョンについては、「_ftell_nolock」を参照してください。
必要条件
関数 |
必須ヘッダー |
省略可能なヘッダー |
---|---|---|
ftell |
<stdio.h> |
<errno.h> |
_ftelli64 |
<stdio.h> |
<errno.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_ftell.c
// This program opens a file named CRT_FTELL.C
// for reading and tries to read 100 characters. It
// then uses ftell to determine the position of the
// file pointer and displays this position.
#include <stdio.h>
FILE *stream;
int main( void )
{
long position;
char list[100];
if( fopen_s( &stream, "crt_ftell.c", "rb" ) == 0 )
{
// Move the pointer by reading data:
fread( list, sizeof( char ), 100, stream );
// Get position after read:
position = ftell( stream );
printf( "Position after trying to read 100 bytes: %ld\n",
position );
fclose( stream );
}
}
Position after trying to read 100 bytes: 100
.NET Framework の相当するアイテム
System::IO::FileStream::Position