ftell, _ftelli64

ファイル ポインターの現在の位置を取得します。

構文

long ftell(
   FILE *stream
);
__int64 _ftelli64(
   FILE *stream
);

パラメーター

stream
ターゲット FILE 構造体。

戻り値

ftell および _ftelli64 は、ファイルの現在の位置を返します。 テキスト モードでは復帰改行変換が発生するため、テキスト モードで開かれたストリームの物理バイト オフセットがftell_ftelli64返され、反映されない場合があります。 with fseek または _ftelli64 with _fseeki64 を使用ftellして、ファイルの場所に正しく戻ります。 エラーが発生し_ftelli64、「ftellパラメーターの検証」の説明に従って無効なパラメーター ハンドラーを呼び出します。 実行の継続が許可された場合、これらの関数では -1L を返し、ERRNO.H で定義された 2 つの定数のどちらかに errno を設定します。 EBADF 定数は、stream 引数が有効なファイル ポインター値ではないかまたは開いているファイルを参照していないことを意味します。 EINVAL は、無効な stream 引数が関数に渡されたことを意味します。 (ターミナルやプリンターなどの) シーク非対応のデバイスの場合、または stream が開いているファイルを参照していない場合、戻り値は未定義です。

リターン コードの詳細については、「errno_doserrno_sys_errlist、および _sys_nerr」を参照してください。

解説

ftell および _ftelli64 関数では、stream に関連付けられたファイル ポインター (存在する場合) の現在の位置を取得します。 位置は、ストリームの先頭を基準としたオフセットとして表されます。

データを追加するためにファイルを開く場合、現在のファイルの位置は、次の書き込みが発生する場所ではなく最後の I/O 操作によって決まります。 たとえば、追加のためにファイルが開き、最後の操作が読み取られたとします。 ファイルの位置は、次の読み取り操作が開始されるポイントであり、次の書き込みが開始される場所ではありません。 (追加のためにファイルを開くと、書き込み操作の前にファイルの位置がファイルの末尾に移動されます)。追加のために開かれたファイルに対して I/O 操作がまだ発生していない場合、ファイルの位置はファイルの先頭になります。

テキスト モードでは、Ctrl + Z は入力時に EOF (end-of-file) 文字として解釈されます。 読み取りおよび書き込みの両方のために開かれたファイルでは、fopen および関連するすべてのルーチンが、ファイル末尾に Ctrl + Z があるかどうかを確認し、削除できる場合は削除します。 これは、Ctrl + Z で終わるファイル内を移動するために、および fseek(または_ftelli64_fseeki64) を使用ftellすると、ファイルの末尾付近で不適切な動作が発生ftell_ftelli64する可能性があるためです。

この関数は実行中に呼び出し元スレッドをロックするため、スレッド セーフです。 ロックしないバージョンについては、「_ftell_nolock」を参照してください。

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT のグローバル状態」を参照してください

必要条件

機能 必須ヘッダー 省略可能なヘッダー
ftell <stdio.h> <errno.h>
_ftelli64 <stdio.h> <errno.h>

互換性の詳細については、「 Compatibility」を参照してください。

// 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

関連項目

ストリーム入出力
fopen, _wfopen
fgetpos
fseek, _fseeki64
_lseek, _lseeki64