0

現在、読み取りを介して 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);
}
4

2 に答える 2

0

「create_resource」、「use_resource」、「free_resource」よりも単純な API を持つのはかなり難しいです。したがって、抽象化に関しては、これはかなり合理的なようです。

&nRead は ReadBytes へのストリーム リーダー引数だと思いますか? そうでない場合、ReadBytes はどのストリームを処理する必要があるかをどのように示しますか? (これが処理しようとしている唯一のストリームである場合は、リソースに名前を付けずに、ReadBytes で一意のリソースを参照するだけでかまいません。ただし、その場合、Reader と CloseReader はストリーム エンティティを返す必要もありません)。

于 2013-06-23T08:55:34.927 に答える