サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−