【问题标题】:How create a FILE* from char * without create a temporary file如何在不创建临时文件的情况下从 char * 创建 FILE*
【发布时间】:2013-03-01 18:03:57
【问题描述】:

我正在创建一个使用 lex 和 yacc 来解析文本的程序,但我需要创建一个包含各种内容的解析器。我不希望使用标准输入,如果我使用 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); 
}

【问题讨论】:

标签: c file stream yacc lex


【解决方案1】:

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

【讨论】:

  • 简单客观,正是我所需要的。
【解决方案2】:

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

  • buffer - 输入缓冲区来读取数据,
  • 结果 - 输出以存储读取的字节数
  • max_size - 输入缓冲区大小

只需使用 header 或 inline 在 Lex 文件中包含宏定义,它将被使用而不是 fread(...)

【讨论】:

  • 我不知道这个选项,谢谢,当时并不是我所需要的,但我认为它对我将来会有很大帮助。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多