Сделать FILE * struct map для буфера? - PullRequest
7 голосов
/ 22 февраля 2012

Я работаю с устаревшим кодом, который использует что-то вроде этого:

void store_data(FILE *file);

Однако я не хочу хранить данные на диске, я хочу сохранить их в памяти (char *buf).Я мог бы отредактировать весь код, но код перескакивает повсюду, и fwrite вызывается для файла повсюду.Так есть ли более простой способ, например, я могу отобразить объект FILE* в (автоматически растущий) буфер? Я не знаю общего объема данных, полученных заранее.

Решение должно быть переносимым.

Ответы [ 5 ]

5 голосов
/ 22 февраля 2012

Невозможно сделать это, используя только средства, предусмотренные стандартом C. Самое близкое, что вы можете прийти, это

FILE *scratch = tmpfile();
...
store_data(scratch);
...
/* after you're completely done calling the legacy code */
rewind(scratch);
buf = read_into_memory_buffer(scratch);
fclose(scratch);

Это действительно ударит по диску, по крайней мере, потенциально, но я бы сказал, что это ваш лучший выбор, если вам нужна широкая переносимость и вы не можете изменить «старый код».

В POSIX.1-2008 есть open_memstream, который делает именно то, что вы хотите; тем не менее, этот пересмотр POSIX еще не получил широкого распространения. В GNU libc (используется в Linux и некоторых других) он есть, но, насколько я знаю, он недоступен в OSX или * BSD и, конечно, не в Windows.

1 голос
/ 22 февраля 2012

Я не знаю, хорошая ли это хорошая идея, но это идея.

Вы можете "переопределить" fwrite, используя макрос.

#define fwrite(a, b, c) your_memory_write_function(a, b, c)

Затем реализуйте memory_write_function для записи данных в ваш автоматически растущий буфер вместо файла.

Вам нужно будет вызвать store_data с указателем на что-то еще (не указатель на FILE). Но это возможно с C , поэтому у вас не возникнет проблем.

1 голос
/ 22 февраля 2012

Возможно, вы захотите взглянуть на fmemopen и open_memstream.Они делают то, что вам нужно.

На странице man:

Функция open_memstream () открывает поток для записи в буфер.Буфер распределяется динамически (как в malloc (3)) и автоматически увеличивается по мере необходимости.После закрытия потока вызывающая сторона должна освободить (3) этот буфер.

0 голосов
/ 22 февраля 2012

На какой платформе вы работаете? Ты не можешь использовать tmpfs? Если вы открываете файл в tmpfs, не является ли он с точки зрения ядра тем же, что и обычный файл, но записывается в память?

0 голосов
/ 22 февраля 2012

Возможно, вы захотите взглянуть на fmemopen () .Если он вам недоступен, вы можете использовать именованный сегмент совместно используемой памяти вместе с fdopen() для преобразования файлового дескриптора, возвращаемого shm_open(), в FILE*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...