写 - 读二进制文件中的结构

时间:2017-09-08 19:25:38

标签: c binaryfiles

我只是想在二进制文件中编写一个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;
}

有我的日志:

  

/ home / sviktor / CLionProjects / untitled / cmake-build-debug / untitled Entrez   une valeur pour x:2.33 Entrez une valeur pour y:1.34 Le point est   auxcoordonnées(x,y)=(2.33,1.34)。 Entrez une valeur pour le nom de   fichier:test123.bin Vousavezentré:test123.bin写回程:0   读取返回:0 Le point estauxcoordonnées(x,y)=(0.00,0.00)。

     

处理完成,退出代码为0

我正在研究Fedora和clion IDE,

Bless编辑说我的test123.bin文件包含这个C4 2E 18 F1 FC 7F 00 00但读取函数不起作用(它给出了点=(0,0))

1 个答案:

答案 0 :(得分:3)

由于您的writePointToFile()readPointFromFile()函数接受指向Point结构的指针,因此您希望将该指针传递给freadfwrite。它是您数据的指针,这是您想要读写的内容。您的代码错误地将指针传递给该指针。

换句话说,在writePointToFile()中,您想要更改通话

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

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

,同样适用于fread中的readPointFromFile()来电。