将结构保存到文件
Saving structs to file
我正在尝试将结构列表保存到文件中并稍后加载它们。
我想从对象数组中输出第一个对象的数据,但是当我试图通过他的指针加载和打印结构的对象时(变量:name
,age
) 程序的输出是这样的:Name: | Age: 0
.
预期的是:Name: Tom | Age: 15
。
(以person object[3] = {"Tom", 15, "Andrew", 25, "Kate", 55};
为例)。
我尝试为此使用 fseek
函数,如何使用它来仅打印第一个对象?
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char name[20];
int age;
} person;
void save(int x, char way[100], person (*p_object)[x]);
void load(char way[100], int x);
FILE *file;
int main(void)
{
char way[100] = "D:\Projects\C\C06_WorkingWithFiles\C005_PositioningInTheStream.dat";
person object[3] = {"Tom", 15, "Andrew", 25, "Kate", 55};
person (*p_object)[3] = &object;
save((sizeof(*p_object) / sizeof(*p_object)[0]), way, p_object);
load(way, 1);
fclose(file);
return 0;
}
void save(int x, char way[100], person (*p_object)[x])
{
if (fopen(way, "r") == NULL)
{
file = fopen(way, "w");
}
char *c = (char *)p_object;
for (int i = 0; i < sizeof(*p_object); i++)
{
putc(*c, file);
c++;
}
}
void load(char way[100], int x)
{
if ((fopen(way, "r")) == NULL)
{
perror("\nError");
exit(0);
}
int position = sizeof(person) * x;
fseek(file, position, SEEK_SET);
person object, *p_object = &object;
char symbol, *c = (char *)p_object;
while ((symbol = getc(file)) != EOF)
{
*c = symbol;
c++;
}
printf("\nName: %s | Age: %d\n", p_object -> name, p_object -> age);
}
这是一个可以满足您要求的实现:
#include <stdio.h>
typedef struct {
char name[20];
int age;
} person;
void save(int num, char path[100], person (*p_object)[num]);
person load(char path[100], int index);
int main(void) {
char path[100] = "output.dat";
person persons[3] = {"Tom", 15, "Andrew", 25, "Kate", 55};
save(3, path, &persons);
person object = load(path, 1);
printf("\nName: %s | Age: %d\n", object.name, object.age);
return 0;
}
void save(int num, char path[100], person (*p_object)[num]) {
FILE *file = fopen(path, "w+");
fwrite(p_object, sizeof(person), num, file);
fclose(file);
}
person load(char path[100], int index) {
person object;
FILE *file = fopen(path, "r");
fseek(file, (long) sizeof(person) * index, SEEK_SET);
fread(&object, sizeof(person), 1, file);
fclose(file);
return object;
}
请注意,最好使用现有功能fread and fwrite而不是自己实现。
这将使您的代码更简单直接。
此外,您对 fread
的实现不正确,因为 EOF 可以出现在那里,因为您正在写入二进制数据,您需要读取结构的整个大小才能加载它。
我正在尝试将结构列表保存到文件中并稍后加载它们。
我想从对象数组中输出第一个对象的数据,但是当我试图通过他的指针加载和打印结构的对象时(变量:name
,age
) 程序的输出是这样的:Name: | Age: 0
.
预期的是:Name: Tom | Age: 15
。
(以person object[3] = {"Tom", 15, "Andrew", 25, "Kate", 55};
为例)。
我尝试为此使用 fseek
函数,如何使用它来仅打印第一个对象?
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char name[20];
int age;
} person;
void save(int x, char way[100], person (*p_object)[x]);
void load(char way[100], int x);
FILE *file;
int main(void)
{
char way[100] = "D:\Projects\C\C06_WorkingWithFiles\C005_PositioningInTheStream.dat";
person object[3] = {"Tom", 15, "Andrew", 25, "Kate", 55};
person (*p_object)[3] = &object;
save((sizeof(*p_object) / sizeof(*p_object)[0]), way, p_object);
load(way, 1);
fclose(file);
return 0;
}
void save(int x, char way[100], person (*p_object)[x])
{
if (fopen(way, "r") == NULL)
{
file = fopen(way, "w");
}
char *c = (char *)p_object;
for (int i = 0; i < sizeof(*p_object); i++)
{
putc(*c, file);
c++;
}
}
void load(char way[100], int x)
{
if ((fopen(way, "r")) == NULL)
{
perror("\nError");
exit(0);
}
int position = sizeof(person) * x;
fseek(file, position, SEEK_SET);
person object, *p_object = &object;
char symbol, *c = (char *)p_object;
while ((symbol = getc(file)) != EOF)
{
*c = symbol;
c++;
}
printf("\nName: %s | Age: %d\n", p_object -> name, p_object -> age);
}
这是一个可以满足您要求的实现:
#include <stdio.h>
typedef struct {
char name[20];
int age;
} person;
void save(int num, char path[100], person (*p_object)[num]);
person load(char path[100], int index);
int main(void) {
char path[100] = "output.dat";
person persons[3] = {"Tom", 15, "Andrew", 25, "Kate", 55};
save(3, path, &persons);
person object = load(path, 1);
printf("\nName: %s | Age: %d\n", object.name, object.age);
return 0;
}
void save(int num, char path[100], person (*p_object)[num]) {
FILE *file = fopen(path, "w+");
fwrite(p_object, sizeof(person), num, file);
fclose(file);
}
person load(char path[100], int index) {
person object;
FILE *file = fopen(path, "r");
fseek(file, (long) sizeof(person) * index, SEEK_SET);
fread(&object, sizeof(person), 1, file);
fclose(file);
return object;
}
请注意,最好使用现有功能fread and fwrite而不是自己实现。
这将使您的代码更简单直接。
此外,您对 fread
的实现不正确,因为 EOF 可以出现在那里,因为您正在写入二进制数据,您需要读取结构的整个大小才能加载它。