c/c++语言开发共享使用类似文件的C字符串*

我有一个C函数,从FILE*读取字符流。

在这种情况下,如何从字符串创建FILE*

编辑:

我认为我的原帖可能会产生误导。 我想从文字字符串值创建一个FILE* ,这样生成的FILE*就会像某个文件某处包含字符串而不实际创建文件一样。

以下是我想做的事情:

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

    标准C不提供这样的function,但POSIX定义了fmemopen()函数,它完全符合您的要求。

    不幸的是,C的标准库不提供此function; 但有几种方法可以解决它:

    上次我遇到这种问题时,我实际创建了一个管道,启动了一个线程,并使用该线程将数据写入管道……但是你必须查看操作系统调用。

    可能还有其他方法,比如创建一个内存映射文件,但我正在寻找一些没有大量工作和研究工作的东西。

    编辑:当然,您可以将问题更改为“我如何找到一个漂亮的临时文件名”。 然后你可以将数据写入文件,并在以下内容中读取:-)

     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 .... ..... 

    也许您可以稍微更改代码以接收自定义句柄。

     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. } 

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

    现在,您只需向解析函数发送一个句柄即可。 该function不关心数据来自何处,甚至可以从网络读取数据!

      以上就是c/c++开发分享使用类似文件的C字符串*相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/549180.html

      (0)
      上一篇 2021年1月13日
      下一篇 2021年1月13日

      精彩推荐