gpt4 book ai didi

C fwrite() 不会保存文件中的所有数据

转载 作者:太空宇宙 更新时间:2023-11-04 06:56:16 25 4
gpt4 key购买 nike

int nrAnimals = 0;
ANIMAL animals[10];
addTestData(animals, &nrAnimals);

static void addTestData(ANIMAL* animals, int* nrAnimals)
{
ANIMAL a1 = {"Max", Dog, Male, 12, "Schoolstraat 1", {1, 2, 3}};
ANIMAL a2 = {"Kiekerjan", Cat, Female, 4, "boven in boom", {4, 3, 2}};
ANIMAL a3 = {"Lorre", Parrot, Male, 40, "werk", {8, 9, 10}};
ANIMAL a4 = {"Fifi", Dog, Female, 1, "1Kerkstraat 13", {1, 1, 100}};
ANIMAL a5 = {"Piep", GuineaPig, Male, 3, "1thuis", {3, 4, 1}};
ANIMAL a6 = {"Fifi", Dog, Female, 1, "2Kerkstraat 13", {1, 1, 100}};
ANIMAL a7 = {"Piep", GuineaPig, Male, 3, "2thuis", {3, 4, 1}};
ANIMAL a8 = {"Fifi", Dog, Female, 1, "3Kerkstraat 13", {1, 1, 100}};
ANIMAL a9 = {"Piep", GuineaPig, Male, 3, "3thuis", {3, 4, 1}};

animals[(*nrAnimals)++] = a1;
animals[(*nrAnimals)++] = a2;
animals[(*nrAnimals)++] = a3;
animals[(*nrAnimals)++] = a4;
animals[(*nrAnimals)++] = a5;
animals[(*nrAnimals)++] = a6;
animals[(*nrAnimals)++] = a7;
animals[(*nrAnimals)++] = a8;
animals[(*nrAnimals)++] = a9;
}


int writeAnimals(const char* filename, const ANIMAL* animalPtr, int nrAnimals)
{
if (filename == NULL || animalPtr == NULL || nrAnimals)
{

}
FILE *fp;
fp = fopen(filename, "w");
fwrite(animalPtr, sizeof(ANIMAL),nrAnimals,fp);
fclose(fp);
return 0;
}

上面是我想包含在我的文件中的结构。在我运行这段代码之后用 hexeditor 打开文件我只看到很多零。

File where I save the animals

我是不是做错了什么?

编辑:

void test_writeAnimals(void)
{
int nrAnimals = 0;
ANIMAL animals[10];
addTestData(animals, &nrAnimals);
int number;
FILE *fp;
number = writeAnimals("Argenis", animals, 10);
fclose(fp);
TEST_ASSERT_EQUAL(1, number);
}

这就是我调用该函数的方式。

typedef enum
{
Cat,
Dog,
GuineaPig,
Parrot
} SPECIES;

typedef enum
{
Male,
Female
} SEX;

typedef struct
{
int Day;
int Month;
int Year;
} DATE;

#define MaxNameLength 25
#define MaxLocationLength 100
typedef struct
{
char Name[MaxNameLength];
SPECIES Species;
SEX Sex;
int Age;
char FoundAtLocation[MaxLocationLength];
DATE DateFound;
} ANIMAL;

最佳答案

fwrite 函数写入您告诉它的固定数量的数据。结构中未使用的空间不会神奇地消失。

例如,struct的第一个成员是

char Name[MaxNameLength];

所以 fwrite 会将 Name 的所有 25 个字符写入文件,而不管第一个动物的名字“Max”只有 3 个字母。

第二个成员是 Species,您将其初始化为 Dog,因此其值为 1

第三个成员是 Sex,您将其初始化为 Male 并具有值 0

此外,struct 本身被填充,以便每个成员对齐到 32 位,第一个成员 Name 实际上占据了 struct 的 28 个字节,不是 25。

因此,十六进制转储的前 28 个字节显示长度为 25 的“最大值”加上 3 个字节的填充,后跟 01 00 00 00,这是 Dog< 的 32 位值 采用小端格式,后跟 00 00 00 00,即 Male 的 32 位值。

4D 61 78 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
01 00 00 00
00 00 00 00

等等。

关于C fwrite() 不会保存文件中的所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44094577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com