fread_s
从流读取数据。 此版本的 fread
具有 CRT 中的安全功能中所述的安全增强功能。
语法
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
为空指针,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> |
有关兼容性的详细信息,请参阅 兼容性。
示例
// 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