0

C++ コードの一部を c に移植しようとしています。私は次の構造を持っています

class reader{
private:
FILE *fp;
alot_of_data data;//updated by read_until() method
public:
  reader(const char*filename)
  read_until(some conditional dependent on the contents of the file, and the arg supplied)
}

次に、何百ものこれらのオブジェクトをインスタンス化し、すべてのファイルが eof になるまで、ファイルごとにいくつかの「read_until()」を使用してそれらを繰り返し処理します。

私が思いつくことができる唯一の解決策は、FILEポインターの配列を作成し、クラスのすべてのプライベートメンバーデータで同じことを行うことです。

しかし、これは非常に面倒です。クラスの機能を関数ポインターとして実装できますか?

すべてのファイルをメモリに保存するにはファイルが大きすぎるため、すべてのファイルからすべてを読み取ることは現実的ではありません ありがとう

4

4 に答える 4

1

情報隠蔽の原則は、使用する言語に関係なく同じです。非表示にするものをソースファイルに移動するだけです。

// reader.h
typedef struct reader reader;

reader* new_reader(const char*filename);
void read_until(reader*, ...);

// reader.c

struct reader {
    FILE *fp;
    alot_of_data data;//updated by read_until() method
};

reader *new_reader(const char*filename) { ... }
void read_until(reader*, ...) { ... }
于 2010-04-01T10:33:03.730 に答える
1

最も簡単な方法は、データを構造体に変換することです。

struct reader
{
  FILE *file;
  alot_of_data data;
};

struct reader次に、最初の引数としてをとる通常の関数を定義します。

int reader_construct(struct reader *r, const char *filename)
{
  if((r->file = fopen(filename, "rt")) == NULL)
    return 0;
  /* do other inits */
  return 1;
}

リーダー関数は次のようになります。

int read_until(struct reader *r, arguments)
{
  /* lots of interesting code */
}

次に、構造体の配列を用意reader_construct()し、それらを呼び出してから、必要に応じてread_until()呼び出しを行います。

もちろん、「オブジェクト」を返す、より動的なコンストラクターを選択することもできます。

struct reader * reader_new(const char *filename)
{
  struct reader *r = malloc(sizeof *r);
  if(r == NULL)
    return NULL;
  if(reader_construct(r, filename))
    return r;
  return NULL;
}
于 2010-04-01T10:33:51.200 に答える
1

抽象データ型を作成します。

typedef struct {
  FILE *fp;
  alot_of_data data;//updated by read_until() method
} reader;

void init_reader(reader* that, const char* filename);
void read_until(reader* that, some conditional dependent on the contents of the file, and the arg supplied)

次に、このタイプのオブジェクトをクラスのオブジェクトと同じように作成して使用できますが、の代わりに次のobj.func()ように記述しますfunc(&obj)

reader r;
init_reader(&r, "blah.txt");
read_until(&r, /* ... */);
于 2010-04-01T10:33:58.813 に答える
0

いつでもすべての関連情報を保持する構造を作成し、それをループすることができます...ただのアイデア...(Cは構造をサポートしていると思います-久しぶりです...)

于 2010-04-01T10:32:17.127 に答える