11.5.2 fread_s

2013-10-07 00:46:09 · 作者: · 浏览: 292

11.5.2  fread_s

在了解了缓冲的大致内容之后,让我们回到fread的代码分析。MSVC的fread的定义在crt/fread.c里,实际内容只有一行:

size_t _fread_nolock(
void *buffer,
size_t elementSize,
size_t count,
FILE *stream
)
{
return fread_s(buffer, SIZE_MAX, elementSize
, count, stream);
}
可见fread将所有的工作都转交给了_fread_ s。fread_s定义如下:
fread -> fread_s:
size_t __cdecl fread_s(
void *buffer,
size_t bufferSize,
size_t elementSize,
size_t count,
FILE *stream
)
{
……
_lock_str(stream);
    retval = _fread_nolock_s(
buffer
, bufferSize
, elementSize
, count
, stream);
    _unlock_str(stream);
return retval;
}
fread_s的参数比fread多一个bufferSize,这个参数用于指定参数buffer的大小。在fread中,这个参数直接被定义为SIZE_MAX,即size_t的最大值,表明fread不关心这个参数。而用户在使用fread_s时就可以指定这个参数,以达到防止越界的目的(fread_s的s是safe的意思)。fread_s首先对各个参数检查,然后使用_lock_str对文件进行加锁,以防止多个线程同时读取文件而导致缓冲区不一致。我们可以看到fread_s其实又把工作交给了_fread_nolock_s。
【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节