次の方法で共有


ftell, _ftelli64

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

構文

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

パラメーター

stream
ターゲット FILE 構造体。

戻り値

ftell および _ftelli64 は、ファイルの現在の位置を返します。 ftellおよび_ftelli64によって返される値は、テキスト モードで開かれたストリームの物理バイト オフセットを反映していない可能性があります。これは、テキスト モードでは復帰改行変換が発生するためです。 _fseeki64fseekまたは_ftelli64ftellを使用して、ファイルの場所に正しく戻ります。 エラーが発生した場合は、「パラメーターの検証で説明されているように、無効なパラメーター ハンドラーをftellおよび_ftelli64呼び出します。 実行の継続が許可された場合、これらの関数では -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 があるかどうかを確認し、削除できる場合は削除します。 これは、 ftellfseek、または _ftelli64_fseeki64の組み合わせを使用して、Ctrl + Z で終わるファイル内を移動すると、 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