我将处理非常庞大的文件,我只想部分地将内容加载到内存中。所以我想知道命令是否:
FILE* file=fopen("my/link/file.txt", "r");
将整个文件内容加载到内存中,还是只是指向内容的指针?打开文件后,我使用fgets()
逐行读取文件。
那么fwrite()
呢?每次我写东西时是否需要打开和关闭文件,以便它不会过载或在后台管理?
另一件事,是否有一个很好的bash命令,如“-time”,可以告诉我执行程序的最大峰值内存?我正在使用OSx。
答案 0 :(得分:4)
根据fopen()
的{{3}},
fopen()
函数打开文件,其名称是路径指向的字符串,并将流与其关联。
所以,不,它不会将文件内容加载到内存或其他地方。
如您所知,要对返回的文件指针进行操作,您需要使用fgets()
和系列。
此外,一旦打开文件,获取指针并且fclose()
不相同,您可以使用指针任意数量的时间写入文件(记得打开文件追加更多)。您不需要打开和关闭对指针进行的每次读写操作。
另外,FWIW,如果你想来回移动文件指针,你可能觉得man page可以派上用场。
答案 1 :(得分:2)
fopen不会将所有文件加载到内存中。它为文件创建文件描述符。就像指向打开文件表的位置的指针一样。 在打开的文件表中,您有一个指向磁盘上文件位置的指针。
如果你想在文件中使用fseek。
另一种选择是使用mmap。这是在调用进程的虚拟地址空间中创建新映射。您可以像数组一样访问该文件..(并非所有文件都加载到内存中。它使用内存页机制加载数据)
答案 2 :(得分:1)
fopen
无法读取文件,fread
和fgets
以及类似的功能。
就我个人而言,我从未尝试过同时阅读和撰写文件。 不过应该可行。 您可以使用多个文件指针指向同一个文件。
没有像time
这样的命令用于内存消耗。最简单的方法是查看top
。有malloc / new替换库可以帮到你。
答案 3 :(得分:0)
将整个文件内容加载到内存中,还是只是指向内容的指针?
没有,
fopen()
打开具有指定文件名的文件,并将其与可由FILE
指针识别的流相关联。
fread()
可用于将文件内容放入缓冲区。
可以执行多个read/write
操作,无需多次打开文件。
像rewind()
和fseek()
这样的函数可用于更改文件中光标的位置。