|
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】
|