C fopen 是否将整个文件读入内存?
Does C fopen read the entire file into memory?
我想知道 fopen 命令是否足够聪明,可以在文件太大时停止读取文件,然后等待一些后续读取命令继续读取。
就此而言,_iobuf 有多大?
fopen(...)
不做任何尺寸检查;它只是 returns 一个文件指针。你有没有想过 fread(...)
?
您始终可以使用 stat(...) 系统调用找到要读取的文件的大小。
如果您查看 here,您会看到 #define BUFSIZ 1024
但这取决于您的 fopen 库实现。 AFAIK,没有标准定义。
根据 C 标准,setbuf()
/setvbuf()
应在 fopen()
之后和其他任何内容之前调用。这些设置新打开文件的缓冲模式和缓冲区大小。这意味着至少在 C 级别 fopen()
不会从它打开的文件中读取任何内容。
然而,OS中的底层文件系统实现可能会提前读入文件缓存,但这在语言标准中显然没有定义。您需要在 OS 文档中或通过实验找到它。
_iobuf
在 C 标准中没有定义。虽然我可能 "guess" 它是什么,但你不太可能需要关心它(它不会包含固定大小的 C 文件缓冲区,而是包含一对值:指向缓冲区的指针和缓冲区尺寸)。
我想知道 fopen 命令是否足够聪明,可以在文件太大时停止读取文件,然后等待一些后续读取命令继续读取。
就此而言,_iobuf 有多大?
fopen(...)
不做任何尺寸检查;它只是 returns 一个文件指针。你有没有想过 fread(...)
?
您始终可以使用 stat(...) 系统调用找到要读取的文件的大小。
如果您查看 here,您会看到 #define BUFSIZ 1024
但这取决于您的 fopen 库实现。 AFAIK,没有标准定义。
根据 C 标准,setbuf()
/setvbuf()
应在 fopen()
之后和其他任何内容之前调用。这些设置新打开文件的缓冲模式和缓冲区大小。这意味着至少在 C 级别 fopen()
不会从它打开的文件中读取任何内容。
然而,OS中的底层文件系统实现可能会提前读入文件缓存,但这在语言标准中显然没有定义。您需要在 OS 文档中或通过实验找到它。
_iobuf
在 C 标准中没有定义。虽然我可能 "guess" 它是什么,但你不太可能需要关心它(它不会包含固定大小的 C 文件缓冲区,而是包含一对值:指向缓冲区的指针和缓冲区尺寸)。