C言語,ftell()関数でファイル位置表示子の値を取得する

スポンサーリンク

鍛錬 756

C言語,ftell()関数でファイル位置表示子の値を取得する

ストリームにおけるファイル位置表示子(読み書き位置)の値を取得するには、ftell()関数を使用します。

バイナリストリームの場合はファイルの先頭からのバイト数(文字数)となるため、ファイルにおける現在の読み書き位置を取得することができます。
 
以下は、ftell()関数についてです。

#include <stdio.h>

long ftell(FILE *stream);
 

引数

以下は、上記の引数についてです。

引数 意味
FILE *stream ファイル位置表示子を取得する対象のストリーム

戻り値

以下は、戻り値についてです。

戻り値
long 成功した場合 ファイル位置表示子の値
long エラーの場合 -1
 
スポンサーリンク

プログラム

以下は、ファイル位置表示子の値(読み書き位置)を取得するプログラム、test_ftell.c です。

今回は、次の順序でファイル位置表示子を取得しています。

順序 内容 ファイル位置表示子の位置
1 fseek()でファイル位置表示子を先頭に移動 0
2 7バイトの文字を書き込み 0 + 7 = 7
3 2バイトの文字を書き込み 7 + 2 = 9
// include
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// main
int main(void)
{
	char filename[256] = "";
	char tmp[256] = "";
	int len;
	int ret;
	long lret;
	FILE *fp;
	
	// --------------------------------------------------------------
	// ファイルオープン
	strncpy(filename, "sample.txt", sizeof(filename) - 1);
	fp = fopen(filename, "w+");
	if (fp == NULL) {
		perror("fopen");
		exit(EXIT_FAILURE);
	}
	
	// --------------------------------------------------------------
	// ファイル位置表示子を先頭に移動
	printf("ファイル位置表示子を先頭に移動\n");
	ret = fseek(fp, 0L, SEEK_SET);
	if (ret != 0) {
		perror("fseek");
		fclose(fp);
		exit(EXIT_FAILURE);
	}
	// ファイル位置表示子の現在地を確認
	lret = ftell(fp);
	if (lret == -1) {
		perror("ftell");
		fclose(fp);
		exit(EXIT_FAILURE);
	}
	printf("  --> 現在のファイル位置表示子 = %ld\n", lret);
	printf("\n");
	
	// --------------------------------------------------------------
	// 文字列を書き込み(7 byte)
	strncpy(tmp, "1234567" ,sizeof(tmp) - 1);
	len = strlen(tmp);
	printf("文字列 %s (%d byte) を書き込み.\n", tmp, len);
	ret = fputs(tmp, fp);
	if (ret < 0) {
		printf("ERROR,fputs\n");
		fclose(fp);
		exit(EXIT_FAILURE);
	}
	// ファイル位置表示子の現在地を確認
	lret = ftell(fp);
	if (lret == -1) {
		perror("ftell");
		fclose(fp);
		exit(EXIT_FAILURE);
	}
	printf("  --> 現在のファイル位置表示子 = %ld\n", lret);
	printf("\n");
	
	// --------------------------------------------------------------
	// 文字列を書き込み(2 byte)
	strncpy(tmp, "AB" ,sizeof(tmp) - 1);
	len = strlen(tmp);
	printf("文字列 %s (%d byte) を書き込み.\n", tmp, len);
	ret = fputs(tmp, fp);
	if (ret < 0) {
		printf("ERROR,fputs\n");
		fclose(fp);
		exit(EXIT_FAILURE);
	}
	// ファイル位置表示子の現在地を確認
	lret = ftell(fp);
	if (lret == -1) {
		perror("ftell");
		fclose(fp);
		exit(EXIT_FAILURE);
	}
	printf("  --> 現在のファイル位置表示子 = %ld\n", lret);
	
	// --------------------------------------------------------------
	// ファイルクローズ
	ret = fclose(fp);
	if (ret != 0) {
		perror("fclose");
		exit(EXIT_FAILURE);
	}
	
	return 0;
}

実行結果

以下は、プログラム test_ftell.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_ftell.c -o test_ftell
***@ubuntu:~/***/test/c$ ./test_ftell
ファイル位置表示子を先頭に移動
  --> 現在のファイル位置表示子 = 0

文字列 1234567 (7 byte) を書き込み.
  --> 現在のファイル位置表示子 = 7

文字列 AB (2 byte) を書き込み.
  --> 現在のファイル位置表示子 = 9
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ cat sample.txt
1234567AB

 
上記に示した通り、ファイル位置表示子の値を取得することができました。

スポンサーリンク

シェアする

フォローする