fread
ストリームからデータを読み取ります。
構文
size_t fread(
void *buffer,
size_t size,
size_t count,
FILE *stream
);
パラメーター
buffer
データの格納場所。
size
項目サイズ (バイト単位)。
count
読み取る項目の最大数。
stream
FILE
構造体へのポインター。
戻り値
fread
は、関数が読み取った完全な項目の数を返します。エラーが発生した場合や、count
に到達する前にファイルの末尾が検出された場合は、count
未満になる可能性があります。 feof
関数または ferror
関数を使用すれば、読み取りエラーとファイルの終端に達した状態とを区別できます。 size
または count
が 0 である場合、fread
は 0 を返し、バッファーの内容は変更されません。 stream
またはbuffer
が null ポインターの場合、fread
は無効なパラメーター ハンドラー呼び出します。これは、パラメーターの検証説明されています。 実行の継続が許可された場合、この関数は errno
を EINVAL
に設定し、0 を返します。
リターン コードの詳細については、「errno
、_doserrno
、_sys_errlist
、および _sys_nerr
」を参照してください。
解説
fread
関数は、入力 stream
から、size
バイトの count
項目まで読み取り、buffer
に格納します。 stream
に関連付けられているファイル ポインター (存在する場合) は、読み取fread
バイト数だけ進めます。 指定したストリームがテキスト モードで開かれている場合、Windows スタイルの改行は Unix スタイルの改行に変換されます。 つまり、復帰と改行 (CRLF) の組み合わせは、単一の改行 (LF) 文字に置き換えられます。 この置き換えは、ファイル ポインターまたは戻り値には影響しません。 エラーが発生した場合、ファイル ポインターの位置は不確定になります。 部分的に読み取られた項目の値を特定できません。
テキスト モード ストリームで使用する場合、要求されたデータの量 (つまり、 size
* count
) が内部 FILE
* バッファー サイズ (既定では 4096 バイト、 setvbuf
を使用して構成可能) 以上の場合、ストリーム データはユーザー指定のバッファーに直接コピーされ、そのバッファーで改行変換が行われます。 変換されたデータは、バッファーにコピーされるストリーム データよりも短くなる可能性があるため、buffer
[return_value
* size
] を超えたデータ (ここで、return_value
は fread
からの戻り値) には、ファイルからの変換されていないデータが含まれる場合があります。 このため、バッファーの目的が C スタイルの文字列として機能させることである場合は、buffer
[return_value
* size
] で文字データを null で終わるようにすることをお勧めします。 テキスト モードとバイナリ モードの効果の詳細については、「fopen
」を参照してください。
この関数は他のスレッドをロックします。 ロックしないバージョンが必要な場合は、_fread_nolock
を使用してください。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
要件
機能 | 必須ヘッダー |
---|---|
fread |
<stdio.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
// crt_fread.c
// This program opens a file named FREAD.OUT and
// writes 25 characters to the file. It then tries to open
// FREAD.OUT and read in 25 characters. If the attempt succeeds,
// the program displays the number of actual items read.
#include <stdio.h>
int main( void )
{
FILE *stream;
char list[30];
int i, numread, numwritten;
// Open file in text mode:
if( fopen_s( &stream, "fread.out", "w+t" ) == 0 )
{
for ( i = 0; i < 25; i++ )
list[i] = (char)('z' - i);
// Write 25 characters to stream
numwritten = fwrite( list, sizeof( char ), 25, stream );
printf( "Wrote %d items\n", numwritten );
fclose( stream );
}
else
printf( "Problem opening the file\n" );
if( fopen_s( &stream, "fread.out", "r+t" ) == 0 )
{
// Attempt to read in 25 characters
numread = fread( list, sizeof( char ), 25, stream );
printf( "Number of items read = %d\n", numread );
printf( "Contents of buffer = %.25s\n", list );
fclose( stream );
}
else
printf( "File could not be opened\n" );
}
Wrote 25 items
Number of items read = 25
Contents of buffer = zyxwvutsrqponmlkjihgfedcb