读取器接口,在C中使用FILE和char *

我正在修改我inheritance的解析器,目前只能通过读取从FILE *读取。 它现在需要能够从char *常量中提取数据,因此可以解析C字符串中的内联文本。

我已经看过以“读者”的forms提供一个简单的界面,所以你可以提供一个文件阅读器和一个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  #include  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); } 

您甚至不需要基础架构中的CharReader 。 相反,当内存缓冲区与文件具有相同的布局时,以下内容应该有效:

 const char *str = "stringToParse"; FILE *f = fmemopen(str, strlen(str), "r"); Reader *r = FileReader(f); // use FileReader to read from string... 

使用比“create_resource”,“use_resource”,“free_resource”更简单的API非常困难。 因此抽象明智这似乎很合理。

我假设&nRead是ReadBytes的流阅读器参数? 如果没有,ReadBytes如何指示它想要处理哪个流? (如果这是您要处理的唯一流,那么您可以保留资源未命名,只需引用ReadBytes中的唯一一个。但在这种情况下,Reader和CloseReader也不需要返回流实体)。