Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   как FILE перенаправить в строку. (http://forum.oszone.net/showthread.php?t=29669)

bilytur 04-06-2004 03:54 205255

Есть некая функция в одной либе.
прототип вроде этого:
int FunctionName(FILE *STREAM, ... );
Возможно-ли и если да то как сделать чтобы она выводила в память а не файл.

Нужно чтобы типа sprintf работала.


hasherfrog 04-06-2004 09:46 205256

Может, вместо fopen использовать fdopen? А с потоком уже работать...

hasherfrog 04-06-2004 14:58 205257

LДа, ещё вспомнил - посмотрите man mmap

bilytur 05-06-2004 03:27 205258

hasherfrog
из мсдн:
_fdopen, _wfdopen
Associate a stream with a file that was previously opened for low-level I/O.
Не понял как его можно связать со строкой?


Еще в вндосе (вобщето это уже не С) есть фича файлмэпинг.
Грубо - говоря пишешь в память, на самом деле пишешь в файл.
А нужно наоборот. Пишешь в файл, на самом деле пишешь в память :)
Как это можно приспособить без создания файла - непонятно.
Файл создавать не хочу. Иначе бы вопроса небыло.

hasherfrog 07-06-2004 09:34 205259

Цитата:

Не понял как его можно связать со строкой?
Ну, скажем так - строку запросто можно рассматривать как стрим. Обычно оттуда читают, но иногда и пишут. В QT это обычное дело.
Цитата:

Файл создавать не хочу
Дык, файла-то и не будет, он весь будет сплошная память. :)
Хотя если смотреть очень глубоко в недры ОС, Ч@рт его знает, что будет файлом а что памятью в каждый конкретный момент времени

bilytur 09-06-2004 03:05 205260

hasherfrog
Если знаете как FILE связать со строкой приведите конкретный пример.
"Стримов" разных много.
И то что они легко перенаправляются - понятно.
Не понятно как конкретный тип (FILE*) перенаправить.

hasherfrog 09-06-2004 10:00 205261

bilytur
Нет у меня конкретного примера. Не писал я такого никогда. Не представляю, зачем это нужно.
Но примерно так:
Код:

//временный файл - открываем через open, не fopen
int fdMain = open("temp.tmp", O_CREAT | O_EXCL | O_TRUNC | O_RDWR);
//копия для передачи в функцию
FILE *fSubst = fdopen(fdMain, "w");
//предварительный буффер - не уверен, что он вообще нужен
void *pTemp = malloc(1024);
//А отсюда мы будем читать после возврата
char * pMemory = (char *)mmap(pTemp, 1024, PROT_READ, MAP_PRIVATE, fdMain, 0);
//теперь вызываем требуемую функцию
FunctionName(fSubst, ...

Не совсем уверен в точном указании флагов (O_EXCL и MAP_PRIVATE)

bilytur 10-06-2004 03:31 205262

hasherfrog
Спасибо за код.  Конкретные вещи всегда лучше "философствования"
Обязательно попробую. Хотя
Цитата:

open("temp.tmp",
несколько смущает...
В любом случае элегантного перенаправления FILE видимо нет, как с другими стримами. ( в MFC например)
Извиняюсь за некоторую назойливость. :)
Спасибо.

hasherfrog 10-06-2004 09:42 205263

bilytur
Я не сказал, но конечно, надо сделать [s]remove("temp.tmp");[/s] опосля работы.
Насчёт MFC - я не совсем понял; Вы хотите сказать, что там есть элегантная работа (?) с FILE? ЕМНИП, там всё больше CFile. Я когда-то нехило с этим намучился.

bilytur 11-06-2004 03:22 205264

hasherfrog
Да нет с FILE конечно же нет, но там кроме CFile есть
еще CArchiveStream, IStream (правда последний это уже ATL)
и они неплохо дополняют друг-друга. По крайней мере создать поток в памяти
как 2 пальца об асфальт. :)


Время: 18:22.

Время: 18:22.
© OSzone.net 2001-