如何从char *创建FILE *而不创建临时文件

时间:2013-03-13 16:49:21

标签: c file stream yacc lex

我正在使用lex和yacc创建一个程序来解析文本,但我需要创建一个包含各种内容的解析器。我不希望使用stdin,如果我使用FILE * yyin指定输入,我可以更改源。我需要可以从库解析(使用lex文件和yacc文件创建)调用该函数来解析此内容并接收结果。

/**
* This i don't know is possible, receive a char * and return a FILE*
*/
FILE *function_parse_to_file(char* text){
    FILE *fp = NULL;
    /**
    * is really necessary create a temporary file with content text?
    */

    return fp
}
/**
* I need call from other library or application
*/
char *function_parse_from_lex(char* text){
    yyin = function_parse_to_file(text);
    init(); 
    yyparse(); 
    fclose(yyin); 
}

3 个答案:

答案 0 :(得分:2)

在符合POSIX-2008标准的系统(以及Linux)上,您可以使用fmemopen在内存缓冲区中获取FILE*句柄。

答案 1 :(得分:1)

您可以使用三个参数定义YY_INPUT宏:buffer,result,max_size,其中:

  • 缓冲区 - 用缓冲区输入读取数据的地方,
  • result - 输出到存储读取的字节数
  • max_size - 输入缓冲区大小

只需使用标题或内联在您的Lex文件中包含宏定义,它将被用来代替fread(...)

答案 2 :(得分:0)

你真的没有明确说明你的问题,但我假设你想要创建一个FILE *,当从中读取数据时,它将返回char *指向的字符串的内容。您可以简单地创建一个管道,然后在读取端调用fdopen。将数据写入写入端有点危险,因为写入可能会阻塞并导致死锁,但您可以分叉子进程并让子进程将数据写入管道。

另一方面,没有真正的理由不创建临时文件。假设您在读取文件后要取消链接,那么数据进入磁盘的可能性很小(操作系统会将其保留在内存中)如果您真的担心可以使用ram磁盘上的路径。 / p>