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

C 二进制文件中的读写结构,c,binaryfiles,C,Binaryfiles,我只是想在二进制文件中写一个点结构,然后读取所写的结构 有人能解释一下为什么这个代码不起作用吗 #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 *

我只是想在二进制文件中写一个点结构,然后读取所写的结构

有人能解释一下为什么这个代码不起作用吗

#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;
}
#包括
#定义N 100
类型定义结构点;
结构点{
浮动x;
浮动y;
};
无效初始点(点*p);
无效显示点(点*p);
无效初始文件名(字符*文件名);
int writePointToFile(字符*文件名,点*p);
int readPointFromFile(char*fileName,Point*p);
int main()
{
点p1={0};
点p2={0};
字符文件名[N]={0};
int exitStatus=0;
初始点(&p1);
显示点(&p1);
initialiseFileName(文件名);
printf(“您的条目:%s\n”,文件名);
printf(“写入返回:%d\n”,writePointToFile(文件名,&p1));
printf(“读取返回:%d\n”,readPointFromFile(文件名,&p2));
showPoint&p2;
返回现有状态;
}
无效初始点(点*p){
printf(“Entrez une valeur pour x:”);
scanf(“%f”和&p->x);
printf(“Entrez une valeur pour y:”);
扫描频率(“%f”和&p->y);
}
无效显示点(点*p){
printf(“lepointestauxcoordonnées(x,y)=(%0.2lf,%.2lf)。\n”,p->x,p->y);
}
void initialiseFileName(char*fileName){
printf(“你的名字是什么?”);
scanf(“%s”,文件名);
}
int writePointToFile(字符*文件名,点*p)
{
FILE*f2=NULL;
f2=fopen(文件名,“wb”);
如果(f2!=NULL){
if(写入(&p,sizeof(结构点),1,f2)!=1){
printf(“无法写入文件”);
fclose(f2);
返回-1;
}
}
其他的
{
printf(“无法打开文件”);
返回-1;
}
fclose(f2);
返回0;
}
int readPointFromFile(char*fileName,Point*p){
文件*f=NULL;
f=fopen(文件名,“rb”);
如果(f!=NULL){
如果(fread(&p,sizeof(结构点),1,f)!=1){
printf(“无法从文件中读取”);
fclose(f);
返回-1;
}
}
否则{
printf(“无法打开文件”);
返回-1;
}
fclose(f);
返回0;
}
这是我的日志:

/home/sviktor/CLionProjects/untitled/cmake build debug/untitled Entrez 瓦勒尔酒x:2.33安特雷兹瓦勒尔酒y:1.34勒点东部 辅助坐标(x,y)=(2.33,1.34)。你的名字是什么 fichier:test123.bin Vous avez entré:test123.bin写入返回:0 读取返回:0点est辅助坐标(x,y)=(0.00,0.00)

进程已完成,退出代码为0

我正在研究Fedora和clion IDE


Bless editor说我的test123.bin文件包含这个
C4 2E 18 F1 FC 7F 00
但是read函数不工作(它给出了point=(0,0))

,因为您的
writePointToFile()
readPointFromFile()
函数接受指向
点的指针,您希望将该指针传递到
fread
fwrite
。它是一个指针,指向您的数据,这是您想要读取和写入的内容。您的代码错误地将指针传递给该指针

换句话说,在
writePointToFile()
中,您要更改调用

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


同样地,对于
fread
调用
readPointFromFile()

由于
writePointToFile()
readPointFromFile()
函数接受指向
结构的指针,您希望将该指针传递到
fread
fwrite
。它是一个指针,指向您的数据,这是您想要读取和写入的内容。您的代码错误地将指针传递给该指针

换句话说,在
writePointToFile()
中,您要更改调用

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


同样地,对于
fread
调用
readPointFromFile()

如果使用hexeditor检查输出文件,您会看到什么?它写得正确吗?什么是“不工作”意思?当调用
fread
fwrite
时,尝试将
p
而不是
&p
作为第一个参数传递
p
是结构的地址
&p
是保存结构地址的指针变量的地址。我想后者有点太多了。
fread(&p,sizeof(struct Point)
==>
fread(p,sizeof(struct Point)
-请注意第一个参数。它的错误不仅仅限于此。通常情况下,您不应该将结构写入这样的文件。结构的实际布局无法保证,因此很可能在另一个编译器、同一编译器的更高版本或完全相同的编译器上重新编译您的程序h不同的选项将使您的程序与保存的文件不兼容。您应该改为以受控方式写入值。如果使用hexeditor检查输出文件,您会看到什么?写入是否正确?什么“不起作用”平均值?调用
fread
fwrite
时,尝试传递
p
而不是
&p
作为第一个参数。
p
是结构的地址;
&p
是保存结构地址的指针变量的地址。我认为后者有点太多。
fread(&p,sizeof)(结构点)
==>
fread(p,sizeof(结构点)
-请注意第一个参数。它的错误不仅仅限于此。通常情况下,您不应该将结构写入这样的文件。结构的实际布局无法保证,因此很可能在另一个编译器、同一编译器的更高版本或完全相同的编译器上重新编译您的程序h不同的选项将使您的程序与保存的文件不兼容。您应该改为以受控方式写入值。