重要编辑:阅读和写作结构[C]
对不起,大家,我犯了一个大错误的结构。 char * name;意思是在结构之外,写在结构之后的文件中。 这样,你读取结构,找出名字的大小,然后读入字符串。也解释了为什么不需要空终止符。 但是,我觉得某处,我的实际问题已得到解答。如果有人想编辑他们的回复,所以我可以选择一个最合适的,我会很感激。
同样,我所问的问题是“如果你阅读了一个结构体,你还阅读它所保存的数据,或者你需要以其他方式访问它”。
很抱歉的混乱
对于分配,我一直在负责其写入和读取结构的盘(使用的fread和fwrite)中的程序。
我很难理解这个概念。 比方说我们有这样的结构:
typedef struct {
short nameLength;
char* name;
}attendenceList;
attendenceList names;
现在假设我们给它这样的数据:
names.name = "John Doe\0";
names.nameLength = strlen(names.name); /*potentially -1?*/
,然后我们使用fwrite的...给出一个文件指针fp。
fwrite(&names,sizeof(names),1,fp);
现在我们关闭文件,稍后打开它来阅读结构。 问题是这样的:当我们在结构中读取时,我们是否还读取了它存储的变量?
我们能那么现在这样做:
if(names.nameLength < 10)
{
...
}
还是我们必须FREAD的东西,不只是结构,或以某种方式进行分配? 假设FREAD是:
fread(&names,sizeof(names),1,fp);
而且假设我们定义了在我国目前的功能结构,如上所述。
感谢您的帮助!
一对夫妇的评论:' “李四”'已经有了'e'后0,这样你就不需要写' “李四\ 0”'。其次,'strlen'返回'size_t',它是一个无符号类型。因此,它不能返回负值。当你把'strlen'的返回值赋给'short'时,如果这个值在'short'的范围内,那么一切都没问题。否则,你会溢出。 – 2010-03-04 20:52:14
你编辑的答案是,如果你用'fwrite'写了一个'struct',然后用'fread'读回,你会得到它,但是如果'struct'有指针,你会得到值的指针返回,这在阅读时可能没有意义。如果你的struct只有一个'short'元素,我不知道你为什么不能写'short'本身,而不是将它包装在'struct'中。也许你实际的'struct'有更多的数据呢?只要没有指针参与'struct',你就没问题。当然,编写二进制数据不能跨不同的机器移植。 – 2010-03-04 21:02:00
实际的结构体包含两个字符串的大小(在结构之后,因此您可以正确使用fseek或知道如何读取它们),并且该程序连续使用两次。 – Blackbinary 2010-03-04 21:23:45