C 自';fread&x27;如果是buffred,是否需要将数据加载到内存中,然后使用它?

C 自';fread&x27;如果是buffred,是否需要将数据加载到内存中,然后使用它?,c,linux,io,operating-system,C,Linux,Io,Operating System,我在带有gcc的linux上使用fopen/fread/fwrite/fseek。在使用数据之前,是否需要分配内存缓冲区并使用fread将数据顺序读取到缓冲区?您必须将缓冲区(由您的代码创建的缓冲区,malloced或local)传递给fread才能将读取的数据传递回您。我不知道你说“fread是缓冲的”到底是什么意思。大多数“C”库调用都是以这种方式运行的。他们不会将其内部存储(缓冲区或其他)返回给您,如果返回,他们将为您提供相应的免费/释放功能 参考它还有一个非常基本的示例。您必须将缓冲区(

我在带有gcc的linux上使用fopen/fread/fwrite/fseek。在使用数据之前,是否需要分配内存缓冲区并使用fread将数据顺序读取到缓冲区?

您必须将缓冲区(由您的代码创建的缓冲区,malloced或local)传递给fread才能将读取的数据传递回您。我不知道你说“fread是缓冲的”到底是什么意思。大多数“C”库调用都是以这种方式运行的。他们不会将其内部存储(缓冲区或其他)返回给您,如果返回,他们将为您提供相应的免费/释放功能

参考它还有一个非常基本的示例。

您必须将缓冲区(由您的代码创建的缓冲区,malloced或local)传递给fread,才能将读取的数据传递回您。我不知道你说“fread是缓冲的”到底是什么意思。大多数“C”库调用都是以这种方式运行的。他们不会将其内部存储(缓冲区或其他)返回给您,如果返回,他们将为您提供相应的免费/释放功能


请参阅,它还有一个非常基本的示例。

对于fread,是的,您必须在进程中分配内存,系统调用会将数据复制到缓冲区中


在某些特殊情况下,您可以在不将数据复制到用户空间的情况下处理数据。请参阅系统调用,它将数据从一个文件描述符直接复制到另一个文件描述符。这可用于将数据从文件传输到网络套接字,而无需过度复制。

使用fread,是的,您必须在进程中分配内存,系统调用会将数据复制到缓冲区中


在某些特殊情况下,您可以在不将数据复制到用户空间的情况下处理数据。请参阅系统调用,它将数据从一个文件描述符直接复制到另一个文件描述符。这可用于将数据从文件传输到网络套接字,而无需过度复制。

当使用C标准库中的
fread
或其他文件I/O函数时,内存会在多个位置进行缓冲

  • 应用程序分配一个缓冲区,该缓冲区被传递到
    fread
    fread
    将数据复制到您的缓冲区中,然后您可以使用它执行任何操作。您负责分配/取消分配此缓冲区
  • C库通常会为您打开的每个
    文件*
    创建一个缓冲区。数据以大块的形式读入该缓冲区。这允许
    fread
    满足许多小的请求,而不必进行大量昂贵的系统调用。这就是人们说
    fread
    缓冲的意思
  • 内核还将缓冲在磁盘缓存中读取的文件。这减少了
    读取
    系统调用所需的时间,因为如果数据已经在内存中,那么当内核从磁盘中提取数据时,程序就不必等待。内核将保留最近读取的文件,并且可能会提前读取按顺序访问的文件
C库缓冲区在打开文件时自动分配,在关闭文件时释放。你根本不需要管理它


内核磁盘缓存存储在物理内存中,不用于任何其他用途。再说一次,你不必管理这个。当您使用C标准库中的
fread
或其他文件I/O函数时,内存会在多个位置进行缓冲

  • 应用程序分配一个缓冲区,该缓冲区被传递到
    fread
    fread
    将数据复制到您的缓冲区中,然后您可以使用它执行任何操作。您负责分配/取消分配此缓冲区
  • C库通常会为您打开的每个
    文件*
    创建一个缓冲区。数据以大块的形式读入该缓冲区。这允许
    fread
    满足许多小的请求,而不必进行大量昂贵的系统调用。这就是人们说
    fread
    缓冲的意思
  • 内核还将缓冲在磁盘缓存中读取的文件。这减少了
    读取
    系统调用所需的时间,因为如果数据已经在内存中,那么当内核从磁盘中提取数据时,程序就不必等待。内核将保留最近读取的文件,并且可能会提前读取按顺序访问的文件
C库缓冲区在打开文件时自动分配,在关闭文件时释放。你根本不需要管理它


内核磁盘缓存存储在物理内存中,不用于任何其他用途。再说一次,你不必管理这个。一旦需要用于其他用途,内存就会被释放。

您还可以如何使用这些数据?如果您的意思是希望在第一次
fread
之前,
fopen
调用会填充内存中的文件缓冲区,那么不,没有。如果您确实不想为此创建自己的缓冲区,您可以尝试改用
mmap
。我认为OP指的是fread是否会请求比请求的字节更多的字节,并在用户空间中对其进行内部缓冲,这样对fread的后续调用就不需要系统调用、上下文、开关、,等等。用户提供的缓冲区只是为了让用户代码可以拥有他们所请求的内容的副本。您还可以如何使用这些数据?如果您的意思是希望在第一次
fread
之前,
fopen
调用会填充内存中的文件缓冲区,那么不,没有。如果您确实不想为此创建自己的缓冲区,您可以尝试改用
mmap
。我认为OP指的是fread是否会请求比请求的字节更多的字节,并在用户空间中对其进行内部缓冲,这样对fread的后续调用就不需要系统调用、上下文、开关、,