2

テキストを読み取るためにライブラリを呼び出しました。このライブラリ API はFILE*ポインタのみを受け入れます。実際には、fread()内部的に呼び出してファイル テキストを読み取ります。

しかし、このライブラリを使用して、.char*ではなく文字列からテキストを読み取る必要もありますFILE*

もちろん、char*文字列を一時ファイルに書き込むことはできますが、何らかの理由でこれを行うことは許可されていません...

実行する方法 ?ありがとう !!

4

5 に答える 5

4

fmemopenをチェックしてください

fmemopen()関数は、buf引数で指定されたバッファーをストリームに関連付けます。

#include <stdio.h>

static char buffer[] = "foobar";

int main (void)
{
  FILE *stream;

  stream = fmemopen (buffer, strlen (buffer), "r");

  /* You got a FILE* pointer, you can call your function here :-) */
}
于 2012-09-14T08:45:06.010 に答える
1

それは可能ですが、簡単ではなく、非常に複雑です。

で共有メモリ ファイル ハンドルを作成できますshm_open。このファイル ハンドルを使用しmmapて、文字列のメモリ領域を指すようにし、 を使用してファイル記述子からポインタfdopenを作成できます。FILE

注:これは POSIX (Linux や Mac OSX など) システムでのみ機能します。Windows システムにも同様の機能があるはずですが、それでも簡単ではありません。

編集fmemopenMassimo Fazzolari による回答で参照されている通話の舞台裏で発生するのは、おそらくこれに似たものです。

于 2012-09-14T08:49:31.090 に答える
0

さまざまなUNIXシステムでは、パイプ/ソケットまたは同様のファイル記述子を作成し、fdopen()を使用してファイル記述子を開き、FILE*ポインターを取得できます。次に、ストリングをパイプ/ソケットに送ります。

このような奇妙な問題に遭遇したときは、プログラム/ライブラリの設計を確認することをお勧めします。奇妙な問題/要件は、悪い設計の強力な兆候です。

于 2012-09-14T08:44:44.137 に答える
0

うーん、どうにかしてプロセスとやり取りするための独自のデバイス ドライバーを作成する以外に、これはトリッキーな作業です。つまり、読み取り時にある種の IPC (共有メモリ、名前付きパイプ、またはその他のもの) を介してプロセスに通信するキャラクター デバイスを作成できるということです。

しかし、これは (1) 厄介であり、(2) UNIX 固有 (移植性がない) であり、(3) 非常に悪い考えです :-)

このような低レベルのトリックがなければ (またはメモリをファイル ハンドルのように扱うことができる移植性のない拡張機能を使用しないと)、これを行うことはできませfreadFILE*

于 2012-09-14T08:41:39.770 に答える
-1

これはできないと思います。fread は、ファイル ストリーム、つまり FILE * または stdout からのみ読み取ることができます。

于 2012-09-14T08:40:45.447 に答える