21

から文字のストリームを読み取る C 関数がありますFILE*

FILE*この状況で文字列からどのように作成できますか?

編集:

私の元の投稿は誤解を招く可能性があると思います。実際にファイルを作成せずに、文字列を含むファイルが実際にどこかにあるかのようFILE*に結果が動作するように、リテラル文字列値から aを作成したいと考えています。FILE*

以下は私がやりたいことです:

void parse(FILE* f, Element* result);

int main(int argc, char** argv){
    FILE* f = mysteryFunc("hello world!");
    Element result;
    parse(f,&result);
}
4

5 に答える 5

26

標準Cはそのような機能を提供しませんが、POSIXはfmemopen()あなたが望むことを正確に実行する関数を定義します。

于 2012-07-08T08:29:40.700 に答える
3

前回この種の問題が発生したとき、実際にパイプを作成し、スレッドを起動し、スレッドを使用してデータをパイプに書き込みました... ただし、オペレーティングシステムの呼び出しを調べる必要があります。

メモリマップファイルを作成するなど、おそらく他の方法がありますが、多くの作業や調査なしで機能するものを探していました.

編集:もちろん、問題を「適切な一時ファイル名を見つけるにはどうすればよいですか」に変更できます。次に、データをファイルに書き込み、それを読み戻すことができます:-)

于 2012-07-08T08:24:12.427 に答える
2
pid_t pid;
int pipeIDs[2];

if (pipe (pipeIDs)) {
   fprintf (stderr, "ERROR, cannot create pipe.\n");
   return EXIT_FAILURE;
} 

pid = fork ();
if (pid == (pid_t) 0) {
   /* Write to PIPE in this THREAD  */

   FILE * file = fdopen( pipe[1], 'w');

   fprintf( file, "Hello world");
   return EXIT_SUCCESS;

} else if (pid < (pid_t) 0) {
  fprintf (stderr, "ERROR, cannot create thread.\n");
  return EXIT_FAILURE;
}


FILE* myFile = fdopen(pipe[0], 'r');

// DONE! You can read the string from myFile

....  .....
于 2012-07-08T08:44:27.683 に答える
2

コードを少し変更して、カスタム ハンドルを受け取ることができるかもしれません。

void parse(my_handle *h, Element *result)
{
  // read from handle and process
  // call h->read instead of fread
}

ハンドルを次のように定義します。

struct my_handle
{
    // wrapper for fread or something
    int (*read)(struct my_handle *h, char *buffer, int readsize);
    // maybe some more methods you need
};

FILE* ラッパーを実装する

struct my_file_handle
{
    struct my_handle base;
    FILE *fp;
};

int read_from_file(struct my_handle *h, char *buffer, int readsize)
{
    return fread(buffer, 1, readsize, ((my_file_handle*)h)->fp);
}

// function to init the FILE* wrapper
void init_my_file_handle(struct my_file_handle *h, FILE *fp)
{
    h->base.read = read_from_file;
    h->fp = fp;
}

次に、文字列リーダーを実装します

struct my_string_handle
{
    struct my_handle base;
    // string buffer, size, and current position
    const char *buffer;
    int size;
    int position;
};

// string reader
int read_from_string(struct my_handle *h, char *buffer, int readsize)
{
    // implement it yourself. It's easy.
}

// create string reader handle
void init_my_string_handle(struct my_string_handle *h, const char *str, int strsize)
{
    // i think you know how to init it now.
}

///////////////////////////////////////////////

これで、解析関数にハンドルを送信するだけで済みます。この関数は、データがどこから来ているかを気にせず、ネットワークからデータを読み取ることさえできます!

于 2012-07-08T13:02:27.660 に答える