fread与fread_s读取⽂件(⼆进制⽂件)
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));
}
return0;
}
fread_s读取流的数据。此版本的具有安全增强功能,如所
述。
size_t fread_s(
void *buffer,
size_t bufferSize,
size_t elementSize,
size_t count,
FILE *stream
);
buffer
数据的存储位置。
bufferSize
⽬标缓冲区的⼤⼩(以字节为单位)。
elementSize
fopen和open区别写⼊字节的项的⼤⼩。
count
要读取的项⽬最⼤数。
stream
为 FILE 结构的指针。
fread_s 返回读取到缓冲区,⽐ count 会⽐(全部)的项数,如果读取错误或⽂件结尾遇到,在 count 达到之前。使⽤ feof 或 ferror 功能与⼀个⽂件关闭条件区分错误。如果 size 或 count 为0,fread_s 返回0,并且缓冲区内容保持不变。如果 stream 或 buffer 是null指针,fread_s 调⽤⽆效参数处理程序,如所述。
如果执⾏允许继续,此功能设置 errno 到 EINVAL 并返回0。
有关错误代码的更多信息,请参见。
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;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。