fread()是c库函数,利于移植,使用缓存,效率较read()高。
原型:
size_t fread(void *buffer, size_t size, size_t count, FILE * stream);
要注意的是它的返回值,如果读取到了文件尾,返回值小于count,可以使用feof()函数检测出来,返回真。
PS:返回值代表的是某种类型的size的个数。
下面程序按照1024k(一次大小为sizeof(char))一次读取二进制文件。
include <stdio.h> #include <string.h> #define BUFFSIZE 1024 int main(int argc, char **argv){ char buff[BUFFSIZE]; FILE *fd = fopen (argv[1], "rb"); int count, errno=0; bzero (buff, BUFFSIZE); while (!feof (fd)){ count = fread (buff, sizeof (char), BUFFSIZE, fd); int n = feof (fd); printf ("%d,%d\n", count, n); printf ("%s\n",strerror (errno)); } return 0; }
fread_s读取流的数据。 fread 此版本的具有安全增强功能,如 CRT中的安全功能所述。
size_t fread_s( void *buffer, size_t bufferSize, size_t elementSize, size_t count, FILE *stream );
buffer
fread_s 返回读取到缓冲区,比 count 会比(全部)的项数,如果读取错误或文件结尾遇到,在 count 达到之前。 使用 feof 或 ferror 功能与一个文件关闭条件区分错误。 如果 size 或 count 为0,fread_s 返回0,并且缓冲区内容保持不变。 如果 stream 或 buffer 是null指针,fread_s 调用无效参数处理程序,如 参数验证所述。 如果执行允许继续,此功能设置 errno 到 EINVAL 并返回0。
有关错误代码的更多信息,请参见 _doserrno、errno、_sys_errlist和_sys_nerr。
fread_s 函数在 buffer读取到 elementSize 字节 count 项从输入 stream 并存储它们。 与 stream 的文件指针(如果有)的字节数增加实际读取的。 如果给定流在文本模式中打开,支持返回换行符对用单个换行符替换。 替换对文件指针或返回值的效果。 ,如果发生错误,文件指针位置是不确定的。 一个部分读取的项的值无法确定的。
此功能锁定其他线程。 如果需要非固定版本,请使用 _fread_nolock。
功能 |
必需的标头 |
---|---|
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; } }