現在、読み取りを介して FILE* からのみ読み取る、継承したパーサーを変更しています。C 文字列内のインライン テキストを解析できるように、char* 定数からもデータを取得できるようにする必要があります。
ファイル リーダーと、パーサーが文字を取得できる 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);
}