2017-09-08 31 views
0

私は、バイナリファイルにPoint構造体を書き込んで、書き込まれた構造体を読み込もうとしています。書き込み - バイナリファイルの構造体を読み取る

なぜこのコードが機能しないのか誰かが説明できますか?

#include<stdio.h> 
#define N 100 

typedef struct Point Point; 
struct Point{ 
    float x; 
    float y; 
}; 

void initialisePoint(Point * p); 
void showPoint(Point * p); 
void initialiseFileName(char * fileName); 
int writePointToFile(char * fileName, Point * p); 
int readPointFromFile(char * fileName, Point * p); 

int main() 
{ 
    Point p1 = {0}; 
    Point p2 = {0}; 
    char fileName[N] = {0}; 
    int exitStatus = 0; 

    initialisePoint(&p1); 
    showPoint(&p1); 

    initialiseFileName(fileName); 

    printf("Vous avez entré : %s\n", fileName); 

    printf("Write return : %d\n", writePointToFile(fileName, &p1)); 

    printf("Read return : %d\n", readPointFromFile(fileName, &p2)); 

    showPoint(&p2); 

    return exitStatus; 
} 

void initialisePoint(Point * p){ 
    printf("Entrez une valeur pour x : "); 
    scanf("%f", &p->x); 
    printf("Entrez une valeur pour y : "); 
    scanf("%f", &p->y); 
} 
void showPoint(Point * p){ 
    printf("Le point est aux coordonnées (x,y) = (%.2lf, %.2lf).\n", p->x, p->y); 
} 
void initialiseFileName(char * fileName){ 
    printf("Entrez une valeur pour le nom de fichier : "); 
    scanf("%s", fileName); 
} 
int writePointToFile(char * fileName, Point * p) 
{ 
    FILE* f2 = NULL; 

    f2 = fopen(fileName, "wb"); 

    if(f2 != NULL){ 
     if(fwrite(&p, sizeof(struct Point), 1, f2) != 1){ 
      printf("Could not write to file."); 
      fclose(f2); 
      return -1; 
     } 
    } 
    else 
    { 
     printf("Could not open file."); 
     return -1; 
    } 
    fclose(f2); 
    return 0; 
} 
int readPointFromFile(char * fileName, Point * p){ 

    FILE* f = NULL; 

    f = fopen(fileName, "rb"); 

    if(f != NULL){ 
     if(fread(&p, sizeof(struct Point), 1, f) != 1){ 
      printf("Could not read from file."); 
      fclose(f); 
      return -1; 
     } 
    } 
    else{ 
     printf("Could not open file."); 
     return -1; 
    } 
    fclose(f); 
    return 0; 
} 

私のログがあります:

/ホーム/ sviktor/CLionProjects /無題/ cmakeのビルド・デバッグ/無題のEntrez 宇根valeurは、x注ぐ:2.33 Entrezの宇根valeur yを注ぐ:1.34ル(x、y)=(2.33,1.34)。 戻り値:0評価点は(x、y)=(0.00、0.00)です。戻り値は次のとおりです。

プロセスは、私はFedoraとclionのIDEに取り組んでいます0

エディタを祝福が私のtest123.binファイルが含まれていることを言うの終了コードで終了し、このC4 2E 18 F1 FC 7F 00 00が、読み取り機能が動作しません(それはポイントを与えている=あなたのwritePointToFile()readPointFromFile()機能があなたのPoint構造体へのポインタを受け入れる(0,0))

+0

ヘキサエディタで出力ファイルをチェックするとどうなりますか?それは正しく書かれましたか? – Retr0id

+0

「機能しない」とはどういう意味ですか? – nicomp

+1

'fread'と' fwrite'を呼び出すときは、最初のパラメータとして '&p'の代わりに' p'を渡してみてください。 'p'は構造体のアドレスです。 '&p'は構造体のアドレスを保持するポインタ変数のアドレスです。後者はあまりにも多すぎると思います。 –

答えて

3

ので、あなたはfreadとにそのポインタを渡したいです。あなたのデータを読み書きするポインタです。コードが間違ってそのポインタへのポインタを渡しています。言い換えれば

は、writePointToFile()に、あなたは

readPointFromFile()freadコールのため
fwrite(p, sizeof(struct Point), 1, f2) 

と同様に呼び出し

fwrite(&p, sizeof(struct Point), 1, f2) 

を変更したいです。

関連する問題