一位读者接口消耗文件与char *用C(A reader interface that consum

2019-11-02 06:06发布

我修改我继承了一个解析器,目前只能从FILE *通过读取保存。 它现在拥有的能够从字符*常量提取数据,以及因此C字符串中的嵌入式文本可以被解析的要求。

我看了看“读者”的形式提供了一个简单的界面,这两个,这样可以提供一个文件阅读器和一个char读者从中解析器可以抢个字符。 例如:

// Inputs
const char *str = "stringToParse";
FILE *f = fopen(...);

// Creating a reader. Each reader stores a function ptr to a destructor
// which closes the file if required and an internal state object.
Reader *r = FileReader(f);
// -or- 
Reader *r = CharReader(str);

// Start parsing ---------------------------
// Inside the parser, repeated calls to:
int error = ReadBytes(&buf /* target buf */, &nRead /* n read out */, maxBytes /* max to read */);
// End parsing -----------------------------

CloseReader(&r); // calls destructor, free's state, self

我想保持这种非常简单的。 是否有任何明显的其他方式来实现这一目标使用我错过了较少的基础设施?

注意:我简化了这个大大的还有什么要突出编程接口担忧。 它实际上在内部使用的wchar_t和编码东东玉米粥,是有点老鼠窝一样的,我将在同一时间解开。


谢谢大家谁回答。 最简洁的答案是使用fmemopen。 我在下面提供了一个完整的例子:

#include <stdio.h>
#include <string.h>

void dump(FILE *f) {
        char c;
        while ((c = fgetc(f)) != EOF)
                putchar(c);
}

int main(int argc, char *argv[]) {
        /* open string */
        const char str[] = "Hello string!\n";
        FILE *fstr  = fmemopen(&str, strlen(str), "r");

        /* open file */
        FILE *ffile = fopen("hello.file", "r");

        /* dump each to stdout */
        dump(ffile);
        dump(fstr);

        /* clean up */
        fclose(ffile);
        fclose(fstr);
}

Answer 1:

你甚至都不需要CharReader在你的基础设施。 相反,当内存缓冲区有布局文件下同应该工作:

const char *str = "stringToParse";
FILE *f = fmemopen(str, strlen(str), "r");

Reader *r = FileReader(f);

// use FileReader to read from string...


Answer 2:

它的漂亮很难有一个比“create_resource”,“use_resource”,“free_resource”简单的API。 所以,聪明的抽象,这似乎相当合理。

我想和NREAD是流阅读器参数的ReadBytes? 如果不是,如何的ReadBytes表明其流所要处理? (如果这是你要处理的唯一流,那么你就可以离开资源无名,只是指唯一一个在的ReadBytes,但在这种情况下,Reader和CloseReader不必要么返回流实体)。



文章来源: A reader interface that consumes FILEs and char* in C