gpt4 book ai didi

c - 在 C 中使用 FILE 和 char* 的读取器接口(interface)

转载 作者:太空宇宙 更新时间:2023-11-04 07:27:14 24 4
gpt4 key购买 nike

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

我研究过以“阅读器”的形式为两者提供一个简单的接口(interface),这样您就可以提供一个文件阅读器和一个字符阅读器,解析器可以从中获取字符。例如:

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

我想让这一切变得非常简单。有没有其他明显的方法可以使用我错过的更少的基础设施来实现这一目标?

注意:为了突出编程接口(interface)问题,我已经大大简化了这一点。它实际上在内部使用 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);
}

最佳答案

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

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

Reader *r = FileReader(f);

// use FileReader to read from string...

关于c - 在 C 中使用 FILE 和 char* 的读取器接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com