C言語によるファイル処理を行う時に、一度EOFまで読み込んだ後に任意の場所にファイルポインタを移動させてまた処理を行いたい時がある。
fseek()関数を利用すると、ファイルポインタを任意の場所まで移動させることが出来る。
int fseek(FILE *stream, long offset, int whence);
*stream
にはファイルポインタを、offset
には基準となる地点からのバイト数を、whence
には基準となる地点を渡す。
whenceには、 stdio.h
で定義される以下の定数を指定することが出来る。
#define SEEK_SET 0 /* ファイルの先頭を基準にする */
#define SEEK_CUR 1 /* その時点でのファイルポインタの位置を基準にする */
#define SEEK_END 2 /* ファイルの終端を基準にする */
例として、学生の一覧が書き込まれているファイル students.txt
を読み込み普通に表示した後に、先頭1文字だけ大文字にして出力するプログラムを示す。
fseek_sample.c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(void)
{
FILE *fp;
char buff[100];
fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("ファイルを開けません。\n");
exit(EXIT_FAILURE);
}
printf("-----学生名の一覧を表示します-----\n");
while (fgets(buff, 100, fp) != NULL) {
printf("%s", buff);
}
printf("\n");
// ファイルポインタfpをファイルの先頭SEEK_SETから0バイトの地点に移動させる
fseek(fp, 0L, SEEK_SET);
printf("-----学生名の一覧を再表示します。-----\n");
while (fgets(buff, 100, fp) != NULL) {
buff[0] = toupper(buff[0]);
printf("%s", buff);
}
printf("\n");
fclose(fp);
return EXIT_SUCCESS;
}
students.txt
takuya
kotaro
toshiaki
chikara
kuniharu
# 実行結果
-----学生名の一覧を表示します-----
takuya
kotaro
toshiaki
chikara
kuniharu
-----学生名の一覧を再表示します。-----
Takuya
Kotaro
Toshiaki
Chikara
Kuniharu