サイトマップ / C言語講座>出入り口>総目次>目次:ファイル>長さが一定のレコード||デモ用
[英文字の出現頻度]←このソース→[ユニークなファイル名]
/* まず最初にこのファイルを開いて、"Func.txt"に変更して下さい。今日はファイルを読み込みモードで開いて、読み込む位置を変えながら長さが一定のレコードを読んで、表示します。
読み込むあるいは書き込む位置を変更する標準ライブラリ関数を、下記に示します。
#include <stdio.h> int fseek(FILE *fp, long int offset, int where); 例:fseek(fp, 64L, SEEK_CUR); 実行結果 戻り値 成功 0 失敗 0 以外
fseek( ) はファイルの先頭、現在のファイル位置、またはファイルの最後から、offset バイト前あるいはうしろにファイル位置 ( ストリーム ) を変更します。ファイル位置とは、ファイル内で次に読み込み、または、書き込みが行われる位置のことです。
where については下記の記号定数で指定します。
SEEK_SET ファイルの先頭から SEEK_CUR 現在のファイル位置から SEEK_END ファイルの最後から
今回のソースプログラムに出てくるもう一つの標準ライブラリ関数を、下記に示します。
#include <stdio.h> long int ftell(FILE *fp); 実行結果 戻り値 成功 現在のファイル位置 失敗 - 1L
ftell( ) は、現在のファイル位置を返します。バイナリファイルの場合、先頭からの位置をバイト単位で返します。
今回のソースプログラムは、同じフォルダにある"Func.txt" というファイルを開きます。このファイルはフィールド幅が 3 の整数と、4 つの文字を1レコードとするデータが書き込まれています。一定の長さのレコードは、fseek( ) を使って、随時読み込む位置を変えながら、レコードを読み込むことができます。このような読み込み方を、ランダムアクセスといいます。
今回は、レコードを読み込み、同時に ftell( ) でファイル位置を調べ、ファイル位置とレコードを表示します。"Func.html" を"Func.txt"に変更し、同じホルダーに置いてから、実行して下さい。 */
#include <stdio.h> #include <stdlib.h> /* exit( ) で必要 */ void main(void); #define REC_SIZE 7L /* レコードの長さ */ #define REC_NUM 11 /* レコードの数 */ void main(void) { FILE *fp; int n; char str[5]; long int pos; long int i; /* ファイルを開くのに失敗したら */ /* プログラムを終了して、シェルに戻る */ if ((fp = fopen("Func.txt", "r")) == NULL) { fprintf(stderr, "Can't Open File\n"); exit(2); } /* 後ろのレコードから表示 */ for (i = REC_NUM - 1; i >= 0; i--) { fseek (fp, i * REC_SIZE, SEEK_SET); pos = ftell(fp); fscanf(fp, "%3d%4s", &n, str); printf("pos = %2ld no = %3d %4s\n", pos, n, str); } fclose(fp); /* ファイルを閉じる */ } |
/* 今回は使っていませんが、ファイルの読み込み、書き込み位置を、ファイルの先頭にする標準ライブラリ関数があります。
#include <stdio.h> void rewind(FILE *fp); 例 rewind(fp);
この関数は下記のコードと同等です。
fseek(fp, 0L, SEEK_SET);
*/
[英文字の出現頻度]←このソース→[ユニークなファイル名]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−