2017-09-08 84 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的 UNE valeur倒X:2.33 Entrez的UNE valeur倒Y:1.34樂point est auxcoordonnées(x,y)=(2.33,1.34)。 Entrezcoordonnées(x,y)=(0.00,0.00)。讀取返回:0 Le est est auxcoordonnées(x,y)=(0.00,0.00)。

過程完成,退出代碼爲0

我工作的Fedora和克利翁IDE,

祝福編輯說,我的test123.bin文件包含此C4 2E 18 F1 FC 7F 00 00但讀功能無法正常工作(它給點=(0,0))

+0

如果使用hexeditor檢查輸出文件,您會看到什麼?它寫的是否正確? – Retr0id

+0

「不工作」是什麼意思? – nicomp

+1

當調用'fread'和'fwrite'時,嘗試傳遞'p'而不是'&p'作爲第一個參數。 'p'是結構的地址; '&p'是保存結構地址的指針變量的地址。我猜想後者有點太過分了。 –

回答

3

由於您的writePointToFile()readPointFromFile()函數接受的一個指針Point結構,你想那個指針傳遞給freadfwrite。這是你的數據指針,這是你想要讀寫的內容。您的代碼錯誤地將指針傳遞給該指針。

換句話說,在writePointToFile(),您希望將電話

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

改變

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

,同樣在readPointFromFile()fread電話。