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

青い直線

サイトマップ / C言語講座出入り口総目次目次:ファイル>長さが一定のレコード||デモ用