【发布时间】:2010-03-04 20:21:05
【问题描述】:
重要编辑:
对不起大家,我在结构上犯了一个大错误。 字符*名称;意味着在结构之外,在结构之后写入文件。 这样,您读取结构,找出名称的大小,然后读取字符串。还解释了为什么不需要空终止符。 但是,我觉得在某个地方,我的实际问题已经得到解答。如果有人想编辑他们的回复,我可以选择最合适的回复。
再次,我要问的问题是“如果您阅读一个结构,您是否也在阅读它所包含的数据,或者您是否需要以其他方式访问它”。
抱歉给您带来了困扰
对于一项任务,我的任务是编写一个程序,该程序将结构写入和读取磁盘(使用 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(&names,sizeof(names),1,fp);
还假设我们已经在当前函数中定义了结构,如上所述。
感谢您的帮助!
【问题讨论】:
-
几个cmets:
"John Doe"在e之后已经有一个0,所以你不需要写"John Doe\0"。其次,strlen返回size_t,这是一个无符号类型。因此,它不能返回负值。当您将strlen的返回值分配给short时,如果该值在short的范围内,则一切正常。否则,你会溢出。 -
编辑的答案是,如果你用
fwrite写一个struct,然后用fread读回它,你会得到它,但如果struct有指针在其中,您可以返回指针的值,这在阅读时可能没有意义。如果你的struct里面只有一个short元素,我不知道你为什么不能写short本身而不是把它包装在struct中。也许您的实际struct中有更多数据?只要struct中不涉及指针,就可以。当然,写入二进制数据是不能跨不同机器移植的。 -
实际的struct包含两个字符串的大小(跟在structs后面,所以你可以正确使用fseek,或者知道怎么读),这个程序连续使用了两次。
标签: c data-structures fread structure