私は、バイナリファイルに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))
ヘキサエディタで出力ファイルをチェックするとどうなりますか?それは正しく書かれましたか? – Retr0id
「機能しない」とはどういう意味ですか? – nicomp
'fread'と' fwrite'を呼び出すときは、最初のパラメータとして '&p'の代わりに' p'を渡してみてください。 'p'は構造体のアドレスです。 '&p'は構造体のアドレスを保持するポインタ変数のアドレスです。後者はあまりにも多すぎると思います。 –