3

私は現在 C++ を使用して、boost::graph を使用してグラフ関連の計算を行っています。boost::graph はそのグラフをドット ファイルとして出力でき、std::stringstream を使用して出力ドット ファイルをキャプチャします。したがって、ドットファイルの内容はメモリに常駐します。

ドット ファイルを使用して、グラフを視覚化したいと考えています (できるだけ速く)。したがって、ドットファイルを生成し、svg ファイルを生成して、キャンバスに印刷したいと考えています。グラフは小さく、とにかくメモリが利用可能であるため、これに一時ファイルを使用することは避けたいと思います。

ただし、graphviz libgraph には機能しかありません。これを機能させる唯一の方法は、実際には移植できないextern Agraph_t *agread(FILE *);ファイルハンドルをハックすることです。struct __FILE

Unix/Linux でライブラリにメモリの内容をファイルとして読み込ませるにはどうすればよいですか?

GraphViz の libcgraph では、ここでオーバーロードされたバージョンを入力できることがわかりましたが、これまでのところ、ドキュメントは有用な場所を示していません。

4

4 に答える 4

4

まあ、それは間違いなく API のバグですが、ここにアイデアがあります。これは、agread()関数がファイルをバイナリ データとして読み込むことを前提としています。

私はあなたが使用している API に精通していないことに注意してください。

  1. を使用してファイルをメモリにマップしますmmap()
  2. そのメモリ領域を使用して、グラフの構築を行います。
  3. を呼び出すときが来たらagread()、そのファイル記述子をFILE *構造体に開きます (fopen()またはfdopen()、記述子を閉じていない場合)。
  4. 構造体を渡しFILE *ます。

編集:または、私の答えを無視してfmemopen()電話を使用してください。それはおそらくあなたが必要としているものです。ただし、誰かが現在応答を書いている場合に備えて、応答を削除したくありませんでした:-)。

于 2011-10-07T15:37:38.270 に答える
3

でパイプを作成しpipe()、データを入力端に書き込み、 を使用fdopen()して、出力ファイル記述子を に渡すのに適したファイルハンドルに変換できますagread()

ただし、これは、データがbytes未満であることが確実な場合にのみ機能します。そうしないと、相手側から何も読み取れないため、書き込みが永久にブロックされる可能性があります。PIPE_BUF

一般に、一時ファイルを使用すると、はるかに簡単で信頼性が高くなります。を使用tmpfile()してファイル ハンドルを取得し、データを書き込み、巻き戻して に渡しますagread()

fh = tmpfile();
fputs( data, fh );
rewind( fh );
graph = agread( fh );
fclose( fh );

(もちろん、エラーをチェックする必要がありますが、簡潔にするためにチェックしませんでした。)

于 2011-10-07T15:30:40.957 に答える
1

GNU libc 拡張機能を使用する場合は、C 文字列をFILE*;として開くことができます。ドキュメントはhttp://www.gnu.org/s/libc/manual/html_node/String-Streams.htmlにあります。

于 2011-10-12T22:41:07.940 に答える
0

Windows では、fopen で名前付きパイプを開くことができます。

FILE* f = fopen("\\\\.\\Pipe\\<pipe name>", "rb");

そのため、データをプッシュする別のスレッドでパイプを作成でき、agread は一時ファイルを必要とせずにパイプから読み取ります。

于 2011-10-07T15:45:05.950 に答える