fread

ファイルから size バイトのデータを n 個読み込み

【書式】
#include <stdio.h>
size_t fread(void *buf, size_t size, size_t n, FILE *fp);

【説明】
ファイルfpからsizeバイトのデータをn個読み込み、bufに格納します。ファイル位置指示子を読み込んだデータバイト分進めます。エラーが発生した場合にはファイル位置指示子の値は不定です。

【引数】
void *buf : 読み込みデータ格納先のポインタ
size_t size : 読み込みデータのバイト長さ
size_t n : 読み込みデータの数
FILE *fp : FILEポインタ

【戻り値】
正常時 : 読み込んだデータ個数(バイトではありません)
ファイル終了時及びエラー時 : nより小さな値

【使用例】
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
	FILE *fp;
	int outbf[10] = {1,2,3,4,5,6,7,8,9,10};
	int inbuf[10];
	int i;

	if (argc != 2) {
		printf("オープンファイル名を指定してください\n");
		exit(EXIT_FAILURE);
	}

	/* バイナリ書き込み読み込みモードでファイルをオープン */
	if((fp = fopen(argv[1], "wb+")) == NULL ) {
		printf("ファイルオープンエラー\n");
		exit(EXIT_FAILURE);
	}

	/* ファイルにデータを書き込み */
	fwrite(outbf, sizeof(int), 10, fp);

	/* ファイルの先頭に移動 */
	fseek(fp, 0L, SEEK_SET);

	/* 書き込んだデータを読み込んでみる */
	fread(inbuf, sizeof(int), 10, fp);

	/* ファイルクローズ */
	fclose(fp);

	/* 読み込みデータの確認 */
	for (i=0; i<10; i++)
		printf("%3d",inbuf[i]);
	printf("\n");

	return 0;
}
【実行結果】
  1  2  3  4  5  6  7  8  9 10
【注意】

MS-DOSやWindowsの環境でバイナリモードで書き込んだファイルを、モードに"b"の指定をせずにテキストモードでfopenしfreadすると、'\r'にあたる0x0dのデータを正しく入力しませんので注意が必要です。モードについては、fopenのモードを参照してください。

(例)
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
        FILE *fp;
        int outbf[10] = {8,9,10,11,12,13,14,15,16,17};
        int inbuf[10];
        int i;
        
        if (argc != 2) {
                printf("オープンファイル名を指定してください\n");
                exit(EXIT_FAILURE);
        }
        
        /* ファイルをバイナリ書き込みモードでオープン */                
        if((fp = fopen(argv[1], "wb")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(EXIT_FAILURE);
        }

        /* ファイルにデータを書き込み */
        printf("fwrite :%d個データを書き込み\n", fwrite(outbf, sizeof(int), 10, fp) );
        
        fclose(fp);
        
        for (i=0; i<10; i++)
                printf("%#x ",outbf[i]);
        printf("\n");
        
        /* ファイルをバイナリ読み込みモードでオープン */                
        if((fp = fopen(argv[1], "rb")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(EXIT_FAILURE);
        }       
        /* 書き込んだデータを読み込んでみる */
        printf("バイナリモードfread :%d個データを読み込み\n", fread(inbuf, sizeof(int), 10, fp));
        
        fclose(fp);
        
        for (i=0; i<10; i++)
                printf("%#x ",inbuf[i]);
        printf("\n");
        
        
        /* ファイルをバイナリを指定せず読み込みモードでオープン */              
        if((fp = fopen(argv[1], "r")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(EXIT_FAILURE);
        }       
        /* 書き込んだデータを読み込んでみる */
        printf("テキストモードfread :%d個データを読み込み\n",fread(inbuf, sizeof(int), 10, fp));
        
        fclose(fp);
        
        for (i=0; i<10; i++)
                printf("%#x ",inbuf[i]);
        printf("\n");
        
        return 0;
}
(実行結果)LSIC試食版で確認
fwrite :10個データを書き込み
0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10 0x11 
バイナリモードfread :10個データを読み込み
0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10 0x11 
テキストモードfread :9個データを読み込み
0x8 0x9 0xa 0xb 0xc 0xe00 0xf00 0x1000 0x1100 0 

※緑字のように正しく入力できないことが確認できます。

戻る


banner
初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved