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不同的选项将使您的程序与保存的文件不兼容。您应该改为以受控方式写入值。