C语言 我如何写一个完整的结构与fwrite()文本文件,使用结构指针,而结构也包含char指针? &g



所以我有一个名为Cars的结构指针,它指向一个结构体,其中包含一些有文本的char指针。我正在尝试使用fwrite将整个结构写入文本文件。

在尝试将文本从结构体放入char *之前,我已经使用了calloc来为结构体分配内存。一切正常,我可以打印结构体的任何值。但我无法将它们导出到文本文件中。在调用fwrite之后,我在文本文件中得到的都是随机文本。我以为它会把东西写成二进制,但不是这样的。而且,每次输出稍有变化时,感觉就像是返回了一些随机地址。下面是我的代码:

int numberOfCars;
typedef struct
{
char *plate;
char *model;
char *color;
char *ownerName;
char *problems;
char *status;
int year;
} car ;
void writeIntoDatabase(car *);
int main()
{
car *Cars;
numberOfCars=2;
Cars=(car *)calloc(numberOfCars, sizeof(car));
int i=0;
(Cars+i)->plate="CJ23YOU";
(Cars+i)->model="Mazda";
(Cars+i)->color="Black";
(Cars+i)->ownerName="Makro_And";
(Cars+i)->problems="Rattling_noise";
(Cars+i)->status="Fixed";
(Cars+i)->year=2019;
i++;
(Cars+i)->plate="CJ65YOM";
(Cars+i)->model="Volkswagen";
(Cars+i)->color="White";
(Cars+i)->ownerName="Mars Andy";
(Cars+i)->problems="Rattling noise lllas";
(Cars+i)->status="Pending";
(Cars+i)->year=2009;
writeIntoDatabase(Cars);
// fprintf(DB_ptr,"%s",(Cars+i)->plate);
printf("%s", (Cars+i)->plate);
return 0;
}
void writeIntoDatabase(car *Cars)
{
FILE *DB_ptr=fopen("carsDBwrite.txt","w");
fwrite(Cars,sizeof(car),numberOfCars,DB_ptr);
fclose(DB_ptr);
}

中的输出我的文件是:dP@ lP@ rP@ xP@, P@"P@ -P@ÿP@ªP@°P@ºP@ IP@ U

我将非常感谢任何建议和/或修复,或任何其他方式使这项工作。我猜fprint f应该是1,但我真的不想使用它,因为fwrite似乎会更好地完成任务。提前感谢!

不工作的原因是fwrite写入一个连续的字节块到文件,但是你的结构体包含指向其他地方的指针,所以你存储的基本上是字符串的地址,而不是字符串本身。

如果你想使用fwrite,你需要使结构体成为一个连续的字节块,即在你的结构体中使用固定大小的char[]。

typedef struct
{
char plate[MAXSIZE];
char model[MAXSIZE];
char color[MAXSIZE];
char ownerName[MAXSIZE];
char problems[MAXSIZE];
char status[MAXSIZE];
char year[MAXSIZE];  // if fwrite is to be used.
} car ;

fwrite函数一般用于写入二进制文件,而不是文本文件。

同样,将指针的值写入文件也不是您想要的。要写指针所指向的字符串,而不是指针本身的值。

您需要的函数是函数fprintf。该函数允许您将指针传递给字符串,并打印实际的字符串,而不是指针的值。

下面是一个基于你发布的代码的示例程序,有一些杂项改进:

#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char *plate;
char *model;
char *color;
char *ownerName;
char *problems;
char *status;
int year;
} car;
void writeIntoDatabase( car *cars, int num_cars );
int main( void )
{
car cars[] = {
{
"CJ23YOU",
"Mazda",
"Black",
"Makro_And",
"Rattling_noise",
"Fixed",
2019
},
{
"CJ65YOM",
"Volkswagen",
"White",
"Mars Andy",
"Rattling noise lllas",
"Pending",
2009
}
};
writeIntoDatabase( cars, sizeof cars / sizeof *cars );
return 0;
}
void writeIntoDatabase( car *cars, int num_cars )
{
FILE *DB_ptr = fopen( "carsDBwrite.txt", "w" );
if ( DB_ptr == NULL )
{
fprintf( stderr, "Error opening file!n" );
exit( EXIT_FAILURE );
}
//print one car per loop iteration
for ( int i = 0; i < num_cars; i++ )
{
fprintf(
DB_ptr,
"%sn%sn%sn%sn%sn%sn%dn",
cars[i].plate,
cars[i].model,
cars[i].color,
cars[i].ownerName,
cars[i].problems,
cars[i].status,
cars[i].year
);
}
fclose(DB_ptr);
}

程序将以下内容写入输出文件:

CJ23YOU
Mazda
Black
Makro_And
Rattling_noise
Fixed
2019
CJ65YOM
Volkswagen
White
Mars Andy
Rattling noise lllas
Pending
2009

相关内容

  • 没有找到相关文章