2015-08-11 3 views
0

Я буду иметь дело с действительно огромными файлами, для которых я хочу лишь частично загрузить содержимое в память. Так что мне было интересно, если команда:Загрузите содержимое файла в память, C

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

загружает все содержимое файла в память или это просто указатель на содержание? После того, как я открою файл, я использую fgets(), чтобы прочитать файл по строкам. А как насчет fwrite()? Нужно ли открывать и закрывать файл каждый раз, когда я что-то пишу, чтобы он не перегружал или не управлялся в фоновом режиме?

Другое дело, может быть, хорошая команда bash, такая как «-time», которая могла бы сказать мне максимальную память пика моей исполняемой программы? Я использую OSx.

+0

[mmap] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/mmap.2.html) существует для Mac OS X. –

ответ

4

Согласно man page для fopen(),

fopen() функция открывает файл, имя которого является строка, на которую указывает путь и связывает поток с ней.

Таким образом, нет, он не загружает содержимое файла в память или в другое место.

Чтобы использовать указатель возвращаемого файла, как вы уже знаете, вам необходимо использовать fgets() и семью.

Также, как только вы открываете файл, получите указатель и не fclose() то же самое, вы можете использовать указатель любое количество времени для записи в файл (не забудьте открыть файл в добавлении больше). Вам не нужно открывать и закрывать для каждые чтение и запись, сделанные указателю.

Кроме того, FWIW, если вы хотите переместить указатель файла взад и вперед, вы можете почувствовать, что fseek() может пригодиться.

+2

fseek() действительно полезен с этой точки зрения! Большое вам спасибо, я не знал об этом методе – malajedala

2

fopen не загружает весь файл в память. Он создает файловый дескриптор файла. Как указатель на место открытой таблицы файлов. в таблице открытых файлов у вас есть указатель на расположение файла на диске.

Если вы хотите поместить в файл, используйте fseek.

другой вариант - использовать mmap. Это создает новое сопоставление в виртуальном адресном пространстве вызывающего процесса. Вы можете получить доступ к файлу как массив .. (а не весь груз файла в память. Это использовать механизм страниц памяти для загрузки данных)

1

fopen не читает файл, fread и fgets и аналогичные функции делают ,

Лично я никогда не пробовал читать и писать файл одновременно. Это должно сработать. Вы можете использовать несколько указателей файлов в одном файле.

Нет такой команды, как time для потребления памяти. Самый простой способ - посмотреть на top. Существуют библиотеки malloc/new replace, которые могут сделать это для вас.

0

загружает содержимое всего файла в память или это только указатель на контент?

Нет, fopen() открыть файл с указанным именем файла и связывает его с потоком, который может быть идентифицирован с помощью FILE указателя.

fread() может использоваться для получения содержимого файла в буфер.

Несколько read/write операции могут быть выполнены без необходимости открывать файлы раз. Функции, такие как rewind() и fseek(), могут использоваться для изменения положения курсора в файле.

Смежные вопросы