加载文件内容到内存,C

Load file content into memory, C

我将处理非常大的文件,我只想将其部分内容加载到内存中。所以我想知道命令是否:

 FILE* file=fopen("my/link/file.txt", "r");  

将整个文件内容加载到内存中还是只是指向内容的指针?打开文件后,我使用 fgets() 逐行读取文件。 那么 fwrite() 呢?我是否需要在每次写东西时打开和关闭文件,以免它超载或在后台管理?

另一件事,是否有像“-time”这样的好 bash 命令可以告诉我所执行程序的最大峰值内存?我正在使用 OSx。

fopen 不会将所有文件加载到内存中。它为文件创建一个文件描述符。就像一个指向打开文件位置的指针 table。 在打开的文件中 table 你有一个指向文件在磁盘上的位置的指针。

如果您想定位到文件中,请使用 fseek。

另一个选项是使用 mmap。这是在调用进程的虚拟地址 space 中创建新映射。您可以像数组一样访问文件..(不是所有文件都加载到内存中。它使用内存页面机制加载数据)

fopen 不读取文件,freadfgets 以及类似函数读取文件。

就我个人而言,我从未尝试过同时读取和写入文件。 不过,它应该可以工作。 您可以使用指向同一个文件的多个文件指针。

没有像time这样的内存消耗命令。最简单的方法就是看top。存在 malloc/new 个可以为您完成此操作的替换库。

根据 man pagefopen()

The fopen() function opens the file whose name is the string pointed to by path and associates a stream with it.

所以,不,它不会将文件的内容加载到内存或其他地方。

要对返回的文件指针进行操作,如您所知,您需要使用fgets()和family

还有,一旦你打开文件,得到一个指针和不fclose()一样,你可以使用这个指针任意次数写入文件(记得打开文件在append more ).您不需要为指针的 每次 读写打开和关闭。

此外,FWIW,如果您想来回移动 文件指针,您可能会觉得fseek() 可以派上用场。

loads the whole file content into memory or it is just a pointer to the content?

不, fopen() 打开具有指定 文件名 的文件并将其与可由 FILE 指针识别的流相关联。

fread() 可用于将文件内容放入缓冲区。

多个read/write操作无需打开文件次数。 rewind()fseek() 等函数可用于更改光标在文件中的位置。