【C言語】第7章第7回:ファイルのシーク操作
Warning: preg_match(): Compilation failed: regular expression is too large at offset 38197 in /home/wp769435/a-mun.com/public_html/wp-content/plugins/easy-table-of-contents/easy-table-of-contents.php on line 1806

ファイルシーク操作は、大規模なデータファイルを効率的に操作するために不可欠なスキルです。本記事では、C言語でのファイルシーク操作の基礎から応用までを学びます。
0. 記事の概要
この記事を読むメリット
- 効率的なデータ操作:シーク操作により特定のデータに直接アクセスできます。
- 応用力の向上:ランダムアクセスが求められる場面で役立ちます。
- 実践的な知識:ファイル操作の高度なスキルを習得できます。
この記事で学べること
- ファイルシーク操作の基本概念
- C言語でのシーク操作の使用方法
- 応用例と実践的なプログラム
活用のイメージ
- 効率的なデータ操作:シーク操作により特定のデータに直接アクセスできます。
- 応用力の向上:ランダムアクセスが求められる場面で役立ちます。
- 実践的な知識:ファイル操作の高度なスキルを習得できます。
この記事で学べること
- ファイルシーク操作の基本概念
- C言語でのシーク操作の使用方法
- 応用例と実践的なプログラム
活用のイメージ
例えば、ログファイルの特定の行にアクセスしたり、大容量ファイルの特定のデータを効率的に処理する際に、ファイルシーク操作が非常に有用です。
1. ファイルシーク操作の基礎
1.1 ファイルシークとは?
ファイルシークとは、ファイル内の特定の位置に直接移動する操作のことです。C言語ではfseek()
やftell()
関数を使用します。
1.2 fseek()の基本
fseek()
関数は、以下の形式で使用されます。
int fseek(FILE *stream, long offset, int origin);
パラメータ:
stream:
操作対象のファイルポインタoffset:
移動量(バイト単位)origin:
基準位置(SEEK_SET
,SEEK_CUR
,SEEK_END
)
1.3 ftell()の基本
ftell()
関数は、現在のファイル位置を取得します。
long ftell(FILE *stream);
使用例:現在の位置を表示します。
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
fseek(file, 0, SEEK_SET); // ファイルの先頭に移動
long position = ftell(file); // 現在の位置を取得
printf("Current position: %ld\n", position);
fclose(file);
return 0;
}
2. ファイルシーク操作の実践
2.1 ファイルの中間位置への移動

#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
fseek(file, 5, SEEK_SET); // ファイルの5バイト目に移動
char buffer[50];
if (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("Data from position 5: %s", buffer);
}
fclose(file);
return 0;
}
動作解説
- ファイルのオープン:
fopen()
で読み取りモードでファイルを開きます。
- 特定位置への移動:
fseek()
で5バイト目に移動します。
- データの読み取り:
fgets()
を使ってデータを読み取ります。
2.2 ファイルの末尾に移動してデータを追加

#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "a+");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
fseek(file, 0, SEEK_END); // ファイルの末尾に移動
fprintf(file, "\nAppended data at the end."); // データを追加
fclose(file);
printf("Data appended successfully.\n");
return 0;
}
動作解説
- ファイルのオープン:
fopen()
で追記モード"a+"
でファイルを開きます。
- 末尾への移動:
fseek()
でファイルの末尾に移動します。
- データの追加:
fprintf()
を使ってデータを追記します。
3. 練習問題

#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
fseek(file, 5, SEEK_SET); // ファイルの5バイト目に移動
char buffer[50];
if (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("Data from position 5: %s", buffer);
}
fclose(file);
return 0;
}
動作解説
fopen()
で読み取りモードでファイルを開きます。fseek()
で5バイト目に移動します。fgets()
を使ってデータを読み取ります。
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "a+");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
fseek(file, 0, SEEK_END); // ファイルの末尾に移動
fprintf(file, "\nAppended data at the end."); // データを追加
fclose(file);
printf("Data appended successfully.\n");
return 0;
}
動作解説
fopen()
で追記モード"a+"
でファイルを開きます。fseek()
でファイルの末尾に移動します。fprintf()
を使ってデータを追記します。以下の課題に挑戦して、ファイルシーク操作のスキルを向上させましょう。
- ファイルの先頭から10バイト目に移動して、その位置からデータを読み取るプログラムを作成してください。
- ファイルの末尾から10バイト目に移動して、その位置からデータを読み取るプログラムを作成してください。
- ファイルの特定の位置にデータを挿入するプログラムを作成してください。
4. 練習問題の解答と解説

問2の解答
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
fseek(file, -10, SEEK_END); // ファイルの末尾から10バイト前に移動
char buffer[50];
if (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("Data from 10 bytes before the end: %s", buffer);
}
fclose(file);
return 0;
}
5. まとめ

#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
fseek(file, -10, SEEK_END); // ファイルの末尾から10バイト前に移動
char buffer[50];
if (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("Data from 10 bytes before the end: %s", buffer);
}
fclose(file);
return 0;
}
5. まとめ
ファイルシーク操作を習得することで、効率的なデータ操作が可能になります。次回は、シーク操作を活用した高度なファイル操作について学びます。