0

私のプログラムには次の4つの構造体があります

struct SType{
    int type;//struct type
};

struct S1{
};

struct S2{
};

struct S3{
};

次のコードを使用して、これらの構造体の状態をファイルに保存しています。

void store(struct SType s1,void *s){

//open file and stuff
//s points to either one of the last three structs
fwrite(&s1,sizeof(s1),1,file);  fwrite(s, size, 1, file);
//structs are always saved in the file in pairs of SType and either one of the last three structs 
}

次のコードを使用してファイルからペアの 2 番目の構造体を取得しようとすると、セグメンテーション違反が発生します。では、fread() を使用して任意の構造体型のオブジェクトを取得するにはどうすればよいでしょうか?

void read(){
void *record;
//read struct SType object from the file 
//now read the second struct of the pair   
fread(record,size,1,file);
}
4

2 に答える 2

3

有効なメモリに読み込む必要があります。voidは「わからない」という意味であり、システムはその値を推測することはできません。あなたが持っているものは次のとおりです。

void read(){
void *record;// This pointer currently is a random value - this will cause a fault when you try and copy data into it by calling:
fread(record,size,1,file);
}

そのはず:

void read(){
void *record;
len = ?; // Your program needs to know this. You must know which structure it is somehow if you are to cast it later. Therefore you should know its size.
record = malloc(len); // Where len has been previously found to be AT LEAST big enough to read into
fread(record,size,1,file);
}

あなたのコードは疑似コードではないと言うように、空にならないように構造体にも何かを入れてください。また、構造体を読んだら、たとえば fread から void * を返すなど、構造体で何かを行うことをお勧めします。

それが役立つことを願っています。

于 2013-10-09T10:13:01.517 に答える