fread

从流读取数据。

语法

size_t fread(
   void *buffer,
   size_t size,
   size_t count,
   FILE *stream
);

参数

buffer
数据的存储位置。

size
项目大小(以字节为单位)。

count
要读取的项的最大数量。

stream
指向 FILE 结构的指针。

返回值

fread 返回函数读取的完整项数;如果发生错误,如果在到达 count 之前遇到文件的末尾,则该数字可能小于 count。 使用 feofferror 函数将读取错误与文件结尾条件区分开来。 如果 sizecount 为 0,则 fread 返回 0 并且缓冲区内容保持不变。 如果 streambuffer 为空指针,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_valuefread 的返回值)可能包含文件中未转换的数据。 因此,如果缓冲区的意图是充当 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

另请参阅

流 I/O
文本和二进制模式文件 I/O
fopen
fwrite
_read