Войти

Показать полную графическую версию : как FILE перенаправить в строку.


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

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

hasherfrog
04-06-2004, 09:46
Может, вместо fopen использовать fdopen? А с потоком уже работать...

hasherfrog
04-06-2004, 14:58
LДа, ещё вспомнил - посмотрите man mmap

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


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

hasherfrog
07-06-2004, 09:34
Не понял как его можно связать со строкой?
Ну, скажем так - строку запросто можно рассматривать как стрим. Обычно оттуда читают, но иногда и пишут. В QT это обычное дело.
Файл создавать не хочу
Дык, файла-то и не будет, он весь будет сплошная память. :)
Хотя если смотреть очень глубоко в недры ОС, Ч@рт его знает, что будет файлом а что памятью в каждый конкретный момент времени

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

hasherfrog
09-06-2004, 10:00
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
hasherfrog
Спасибо за код.  Конкретные вещи всегда лучше "философствования"
Обязательно попробую. Хотя open("temp.tmp", несколько смущает...
В любом случае элегантного перенаправления FILE видимо нет, как с другими стримами. ( в MFC например)
Извиняюсь за некоторую назойливость. :)
Спасибо.

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

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




© OSzone.net 2001-2012