2

最近、ポインタの操作を開始し、いくつかのテキストファイルをつなぎ合わせることになっている小さなスクリプトを作成しました。

ただし、fputsを呼び出そうとすると、コアダンプ/セグメンテーションエラーが発生します。ファイルポインタの保存方法が原因だと思います。ファイルがそれを配列に保存しているのを見つけて、後でそれを取得しようとします。

FILEポインタは構造体に保存されます。誰かが私のせいをすぐに見つけますか?私は非常に感謝されます!

構造体:

typedef struct{
int listSize;
int listCapacity;
FILE *fileStream;
}FileList;

構造体の作成

FileList fileList;
fileList.listSize=0;
fileList.listCapacity=1;
fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE));

次に、を呼び出して構造体を配列に追加します

void addFile(FileList* list, FILE* file)
{
    list->fileStream[list->listSize]=*file;
}

しかし、私が電話するとき

char* buffer[10];
size_t result=0;

result = fread(buffer,1,10,&fileList.fileStream[ii+currentGroupOffset]);
    fputs(*buffer,outPutFile);

クラッシュします。配列の境界を超えないように、値ii+currentGroupOffsetを監視しようとしました。

すべての助けが必要です!:)

4

3 に答える 3

1

動的に割り当てられたFILE*要素の配列が必要なようです。あなたが持っている:

FILE *fileStream;

FILEこれは、ポインターまたはFILE要素の配列として扱うことができます。FILEしかし、ポインタの配列としてではありません。そのためには、次のものが必要です。

FILE **fileStream;

また、アレイの割り当ては次の方法で行う必要があります。

fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE*));

FILE直接使用するタイプではありません。あなたはいつもそれへのポインタを扱います。不透明(OPAQUE)型として扱う必要があります。

fopen()また、コード内のどこで(を使用して)実際にファイルを開いているのかわかりません。

于 2012-11-13T00:11:20.907 に答える
1

なぜ

char * buffer[10];

そのはず

char buffer[10];

どこでlist->listSizeインクリメントされますか?

これが何なのかわかりません

 fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE));

FILE *fopensは、メモリを割り当てるのではなく、呼び出すことによって初期化されます

于 2012-11-13T00:13:53.950 に答える
1

構造を自分で割り当ててコピーすることはできませんFILE。これは不透明(OPAQUE)型のデータ型です。したがって、FILE構造体の配列を作成する代わりに、FILE *ポインターの配列を作成します。

typedef struct {
    int listSize;
    int listCapacity;
    FILE **fileStream;
} FileList;

FileList fileList;

fileList.listSize = 0;
fileList.listCapacity = 1;
fileList.fileStream = calloc(fileList.listCapacity, sizeof fileList.fileStream[0]);

FILE *次に、ポインター値をコピーして、配列にポインターを追加します。

void addFile(FileList *list, FILE *file)
{
    list->fileStream[list->listSize] = file;
}

そしてそれをそのように使用します:

char buffer[10];
size_t result = 0;

result = fread(buffer, 1, 10, fileList.fileStream[ii+currentGroupOffset]);
fwrite(buffer, 1, result, outPutFile);
于 2012-11-13T00:18:04.230 に答える