gpt4 book ai didi

c - 如何在 C 中写入和读取包含另一个结构的结构?

转载 作者:行者123 更新时间:2023-12-04 11:22:58 26 4
gpt4 key购买 nike

这是我的结构:

typedef struct 
{
char* description;
char* alternativeAnswer[4];
int rightAnswer;
}question;

typedef struct
{
question** questions;
int size;
int max;
}questionList;

我想将一个questionList 保存到一个文件中,然后从中读取。但是如果我这样写:

fwrite(a_questionList,sizeof(questionList),1,outfile);

并以这种方式阅读:

fread(newQuestionList,sizeof(questionList),1,infile);

我发现只有sizemax保存和读取成功。那么如何保存和读取问题呢?谢谢!

最佳答案

请注意,如评论中所述,这不起作用,因为您正在使用问题列表的指针。对于 char 字符串,程序将读取字符直到 \0。被发现。但是对于其他任何事情,只会写入指针变量的值;也就是说,只是内存地址。

(顺便说一句,您对问题列表使用双指针有点奇怪。我假设这是一个错误,您的意思是 question * questions。)

我的建议是为每个结构写一个 write_<structure>函数,并将它们用于更多外部组件的功能中的内部组件,遵循从内到外的结构层次结构。这里只有一个间接级别,只有一个项目列表,但这种方法对于多级、多列表问题非常有用。

但是请注意,由于您使用的是指针,因此您最终必须在读取时预先分配它们。而且,由于您在声明时没有指定这些字符串的长度(您可以为同一个指针分配 10 或 10000 个字符),您将不知道每个字符串要读取多少个字符。出于这个原因,我还会为 char 字符串使用预定义的最大长度;否则,您最终将不得不在阅读时预先分配它们。此外,这样做还可以一次编写整个结构。声明看起来像这样:

#define NUM_OF_QUESTIONS    10
#define MAX_STRING_LEN 256
#define NUM_OF_ALT_ANSWERS 4

typedef struct {
char description[MAX_STRING_LEN];
char alternativeAnswer[NUM_OF_ALT_ANSWERS][MAX_STRING_LEN];
int rightAnswer;
} question;

typedef struct {
question questions[NUM_OF_QUESTIONS];
int size;
int max;
} questionList;

这样做,您现在可以使用单个 fwrite和一个 fread写和读一个单一的去整个问题列表。对于这种特殊情况,您将完成。

请注意,我固定了问题的数量。如果你不想这样做(也就是说,如果你仍然有 question * questions ),我的建议是使用以前的(更具可扩展性)建议的方法,也就是说,有这样的东西:

int write_question(FILE * fHdl, question * q, int items) {
return fwrite((void*)(q), sizeof(question), items, fHdl);
}

int write_questionList(FILE * fHdl, questionList * qList, int numOfQuestions) {
int nBytes = write_question(fHdl, qList->questions, numOfQuestions);
if (0 != nBytes) {
nBytes += fwrite((void*)(&(qList->size)), sizeof(int), 1, fHdl);
nBytes += fwrite((void*)(&(qList->max)), sizeof(int), 1, fHdl);
}
return nBytes;
}

阅读也是如此。

关于c - 如何在 C 中写入和读取包含另一个结构的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59392704/

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