Альтернативы fopen, fread для чтения из строки? - PullRequest
0 голосов
/ 25 мая 2018

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

string str = "I now have the string from file.txt in memory";

// original code:
FILE *file = fopen("file.txt", "rb");
// ...
uint8_t buffer[128];
// ...
var->var1 = buffer;
// ...
var->var2 = fread(buffer, 1, 128, file);
// ...

Итак, простой вопрос, какова альтернатива fread для чтения из строки в буфер?

Платформа: Windows

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Там - это функция, которая делает именно то, что вы хотите: fmemopen.Вы передаете ему указатель на строковый буфер в памяти и флаг "r" или "w" (точно так же как fopen), и он дает вам обычный старый FILE *, из которого вы можете читать или записывать -- или, в вашем случае, перейдите к функции, которой требуется FILE * для чтения или записи.

Она доступна в glibc и, следовательно, практически во всех версиях Linux.Я думаю, что это доступно в некоторых версиях Unix.Кажется, у меня его нет на Mac.Боюсь, вам, вероятно, будет нелегко найти его для Windows.

0 голосов
/ 25 мая 2018

Если вам не требуется FILE *, если вам просто нужно скопировать подсчитанные символы из одного буфера (или строки) в другой, то для этого memcpy.Например, в первом приближении вы могли бы заменить

fread(buffer, 1, 128, file);

на

memcpy(buffer, str, 128);

Теперь это будет очень плохо, если str не содержит 128 символов.(Если бы у вашего file было меньше 128 символов, fread даст вам меньше 128.) Таким образом, более безопасная замена будет

int n = 128;
if(strlen(str) < n) n = strlen(str);
memcpy(buffer, str, n);
0 голосов
/ 25 мая 2018

Если я правильно понимаю вашу задачу, вам нужно получить информацию из строки, как если бы она была записана из файла.Очень удобный способ решить эту проблему - std :: stringstream , если вы используете C ++.

...