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
为空指针,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> |
有关兼容性的详细信息,请参阅 兼容性。
示例
// 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