Poszukuję sposobu przekazania w postaci FILE *
dla niektórych funkcji, aby funkcja mogła do niej pisać za pomocą fprintf
. Jest to łatwe, jeśli chcę, aby dane wyjściowe pojawiały się w rzeczywistym pliku na dysku, powiedzmy. Ale zamiast tego chciałbym uzyskać wszystkie dane wyjściowe w postaci ciągu znaków (char *
). Rodzaj API Chciałbym to:Tworzenie strumienia FILE *, który powoduje ciąg znaków
/** Create a FILE object that will direct writes into an in-memory buffer. */
FILE *open_string_buffer(void);
/** Get the combined string contents of a FILE created with open_string_buffer
(result will be allocated using malloc). */
char *get_string_buffer(FILE *buf);
/* Sample usage. */
FILE *buf;
buf = open_string_buffer();
do_some_stuff(buf); /* do_some_stuff will use fprintf to write to buf */
char *str = get_string_buffer(buf);
fclose(buf);
free(str);
glibc nagłówki wydają się wskazywać, że plik można skonfigurować funkcje hakowych przeprowadzić rzeczywistą czytania i pisania. W moim przypadku myślę, że chcę, aby hak do zapisu dołączał kopię ciągu do połączonej listy, i aby istniała funkcja get_string_buffer
, która oblicza całkowitą długość listy, przydziela jej pamięć, a następnie kopiuje każdy element do niego we właściwym miejscu.
Dążę do czegoś, co może być przekazane do funkcji, takiej jak do_some_stuff
, bez tej funkcji, która musi znać cokolwiek poza tym, że ma do niej dostęp FILE *
.
Czy istnieje jakieś wdrożenie czegoś takiego? Wydaje się, że jest to użyteczne i przyjazne dla C - zakładając, że mam rację co do możliwości rozszerzenia o FILE
.
open_memstream jest dokładnie tym, czego chcę. Nie jestem pewien, czy używa on podejścia z listą odsyłaczy, ale nie będę pisał do niego dużych kwot, więc nie ma to znaczenia. – Edmund