将文件内容加载到内存中,C

时间:2015-08-11 08:04:47

标签: c file-io fopen

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

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

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

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

4 个答案:

答案 0 :(得分:4)

根据fopen()的{​​{3}},

  

fopen()函数打开文件,其名称是路径指向的字符串,并将流与其关联。

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

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

此外,一旦打开文件,获取指针并且fclose()不相同,您可以使用指针任意数量的时间写入文件(记得打开文件追加更多)。您不需要打开和关闭对指针进行的每次读写操作。

另外,FWIW,如果你想来回移动文件指针,你可能觉得man page可以派上用场。

答案 1 :(得分:2)

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

如果你想在文件中使用fseek。

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

答案 2 :(得分:1)

fopen无法读取文件,freadfgets以及类似的功能。

就我个人而言,我从未尝试过同时阅读和撰写文件。 不过应该可行。 您可以使用多个文件指针指向同一个文件。

没有像time这样的命令用于内存消耗。最简单的方法是查看top。有malloc / new替换库可以帮到你。

答案 3 :(得分:0)

  

将整个文件内容加载到内存中,还是只是指向内容的指针?

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

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

可以执行多个read/write操作,无需多次打开文件。 像rewind()fseek()这样的函数可用于更改文件中光标的位置。