2017-03-24 7 views
-3

私が扱っているライブラリでは、未知の量のテキストを格納するための入力としてFILE *が必要です。通常、私はFILE *としてcoutを渡すことができますが、代わりにこの未知のサイズのテキストを変数に取り込みたいと思います。FILE *を大きくなるメモリ空間に開く

埋めるべき成長するサイズのバッファにFILE *を作成する良い方法はありますか?

私はこのような何かを認識してい -

char output[1024] 
FILE *foutput = fmemopen(output, 1024, "w"); 

が、私が理解から、これはに書き込むことができ、1024バイトの固定サイズのバッファを開きます。

+0

動的に割り当てられたメモリのようなものをお探しですか?または、あなたの問題はリダイレクト標準出力に関連していますか? –

+0

可能な複製http://stackoverflow.com/questions/539537/memory-buffer-as-file/8908037 – kennytm

+0

CはOOP言語ではありません。演算子の拡張/オーバーロードや型の拡張はできません。また、 'FILE'は実装定義の不透明型です(これは1つとして扱う必要があります)。 – Olaf

答えて

2
char *ptr = NULL; 
size_t size = 0; 
FILE *fp = open_memstream(&ptr, &size); 

今、あなたはfpstdioを持つ関数を使用してptrを経由して「印刷」出力にアクセスすることができます。バッファは自動的に拡張され、fcloseのストリームの後にfree dになるはずです。

open_memstreamは標準Cではありませんが、POSIX.1-2008で指定されています。しかし、それについてのISO C TRがあります。上の操作中に呼び出されますあなたがあなた自身のfreadfwritefseekfclose関数を定義することができopen_memstreamは(MacOSのように)利用できない、あなたがfopencookiefunopenを使用してそれを実装できるシステム、、、については

ストリーム。どちらも標準化されていません(最初はGNU拡張、2番目はBSD固有)。

このようなシステムではBSD libc's implementationを使用できます。

C標準で義務付けられているAPIのみを実装するシステムの場合、あなたは不運です。あなたができることは、出力を一時ファイルに書き込んだり(おそらくramfsなどに保存しておきます)、そこから読み込むことです。


あなたががFILE IOを使用してAPIと対話している場合にのみ行ってください。これが要件でない場合は、代わりにstd::stringstreamなどを使用することを検討してください。

+0

フィードバック(downvote関連またはそうでなければ) – a3f

+0

これはかなりglibcの答えだと思います(OS Xはそれを実装していません)。私はそれが質問者のための問題だとは思わない。なぜなら、 'fmemopen'はかなり' glibc'だからです。私はdownvoter btwではない、実際には、私はupvoted。 – JeremyP

+0

Open_memstreamを実装するために使用される@JeremyP 'funopen'は、OS Xで利用できます。私は答えを修正しました。 – a3f

関連する問題