fread_s
ストリームからデータを読み取ります。 これは、「CRT のセキュリティ機能」の説明にあるとおり、セキュリティが強化されたバージョンの fread
です。
構文
size_t fread_s(
void *buffer,
size_t bufferSize,
size_t elementSize,
size_t count,
FILE *stream
);
パラメーター
buffer
データの格納場所。
bufferSize
ターゲット バッファーのサイズ (バイト単位)。
elementSize
読み取る項目のサイズ (バイト単位)。
count
読み取る項目の最大数。
stream
FILE
構造体へのポインター。
戻り値
fread_s
はバッファに読み込まれた (完全な) 項目の数を返します。ただし、読み取りエラーが発生したり、count
に到達する前にファイルの末尾が検出されたりした場合、値は count
より小さくなることがあります。 feof
関数または ferror
関数を使用すれば、エラーとファイルの終端に達した状態とを区別できます。 size
または count
が 0 である場合、fread_s
は 0 を返し、バッファーの内容は変更されません。 stream
またはbuffer
が null ポインターの場合、fread_s
は無効なパラメーター ハンドラー呼び出します。これは、パラメーターの検証説明されています。 実行の継続が許可された場合、この関数は errno
を EINVAL
に設定し、0 を返します。
エラー コードの詳細については、「errno
、_doserrno
、_sys_errlist
、_sys_nerr
」を参照してください。
解説
fread_s
関数は、入力 stream
から、elementSize
バイトの count
項目まで読み取り、buffer
に格納します。 stream
に関連付けられているファイル ポインター (存在する場合) は、読み取fread_s
バイト数だけ進めます。 特定のストリームがテキスト モードで開かれた場合、復帰と改行の組み合わせは単一の改行文字に置き換えられます。 この置き換えは、ファイル ポインターまたは戻り値には影響しません。 エラーが発生した場合、ファイル ポインターの位置は不確定になります。 部分的に読み取られた項目の値を特定できません。
この関数は他のスレッドをロックします。 ロックしないバージョンが必要な場合は、_fread_nolock
を使用してください。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
要件
機能 | 必須ヘッダー |
---|---|
fread_s |
<stdio.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
// crt_fread_s.c
// Command line: cl /EHsc /nologo /W4 crt_fread_s.c
//
// This program opens a file that's named FREAD.OUT and
// writes characters to the file. It then tries to open
// FREAD.OUT and read in characters by using fread_s. If the attempt succeeds,
// the program displays the number of actual items read.
#include <stdio.h>
#define BUFFERSIZE 30
#define DATASIZE 22
#define ELEMENTCOUNT 2
#define ELEMENTSIZE (DATASIZE/ELEMENTCOUNT)
#define FILENAME "FREAD.OUT"
int main( void )
{
FILE *stream;
char list[30];
int i, numread, numwritten;
for ( i = 0; i < DATASIZE; i++ )
list[i] = (char)('z' - i);
list[DATASIZE] = '\0'; // terminal null so we can print it
// Open file in text mode:
if( fopen_s( &stream, FILENAME, "w+t" ) == 0 )
{
// Write DATASIZE characters to stream
printf( "Contents of buffer before write/read:\n\t%s\n\n", list );
numwritten = fwrite( list, sizeof( char ), DATASIZE, stream );
printf( "Wrote %d items\n\n", numwritten );
fclose( stream );
} else {
printf( "Problem opening the file\n" );
return -1;
}
if( fopen_s( &stream, FILENAME, "r+t" ) == 0 ) {
// Attempt to read in characters in 2 blocks of 11
numread = fread_s( list, BUFFERSIZE, ELEMENTSIZE, ELEMENTCOUNT, stream );
printf( "Number of %d-byte elements read = %d\n\n", ELEMENTSIZE, numread );
printf( "Contents of buffer after write/read:\n\t%s\n", list );
fclose( stream );
} else {
printf( "File could not be opened\n" );
return -1;
}
}
Contents of buffer before write/read:
zyxwvutsrqponmlkjihgfe
Wrote 22 items
Number of 11-byte elements read = 2
Contents of buffer after write/read:
zyxwvutsrqponmlkjihgfe