1. ファイルの概要
コンピュータ上のファイルは、プログラムファイルとデータファイルに大別されます。プログラムファイルはコンパイル可能なソースコードや実行可能形式を指します。
2. ファイル形式の分類
- プログラムファイル: ソースファイル(.c)、オブジェクトファイル(Windows:.obj/Linux:.o)、実行ファイル(.exe)
- データファイル: テキスト形式とバイナリ形式に分類されます
3. データ保存形式の違い
テキストファイルはASCIIコードで保存され、バイナリファイルはメモリ上の2進表現をそのまま保存します。
// 例:数値12345の保存形式
テキスト形式: 31 32 33 34 35(ASCII文字列"12345")
バイナリ形式: 30 39 00 00(32ビット整数の16進表現)
4. ファイル操作の基本
ファイル操作には以下のプロセスが必要です:
- fopen()でファイルを開く
- fread()/fwrite()等でデータ処理
- fclose()でファイルを閉じる
5. ファイルポインタの役割
FILE構造体を指すポインタを通じてファイル操作を行います。Windows環境では以下のように使います:
FILE *fp = fopen("data.txt", "r");
if (fp) {
// ファイル処理
fclose(fp);
}
6. 順次アクセス操作
文字単位の読み書き:
// 文字書き込み例
FILE *fp = fopen("output.txt", "w");
fputc('A', fp);
fclose(fp);
// 読み込み例
FILE *fp = fopen("input.txt", "r");
int ch;
while ((ch = fgetc(fp)) != EOF) {
printf("%c", ch);
}
fclose(fp);
7. ランダムアクセス操作
fseek()関数を使用して任意の位置に移動できます:
FILE *fp = fopen("data.bin", "rb");
fseek(fp, 100, SEEK_SET); // 先頭から100バイト移動
long pos = ftell(fp); // 現在位置取得
rewind(fp); // 先頭に戻る
fclose(fp);
8. ファイル終端判定
テキストファイルはEOFチェック、バイナリファイルは読み込みサイズで判定:
// バイナリ読み込み例
size_t items_read = fread(buffer, 1, buffer_size, fp);
if (items_read < buffer_size) {
if (feof(fp)) printf("正常な終端");
if (ferror(fp)) printf("エラー発生");
}
9. ファイルバッファリング
システムは自動的にメモリ上にバッファ領域を確保します。fflush()でバッファの強制書き込みが可能です。