在从文件中读出结构体 然后对其中的一个成员进行处理,但是当读一个成员时 会把后面成员的内容也读出来

来源:百度知道 编辑:UC知道 时间:2024/05/30 19:16:16
这是我的结构体 以a+方式写入
typedef struct DocumentIndex
{
char doc_in_top[10];//所在主题标号 例303i
char documentno[15];//文档标号例如FT911-1
char doc_content[20480];//文档内容
char doc_sub_bit[60];//文档包含哪些子主题
struct DocumentIndex *next;

}Document;
rb形式打开;
docnode=(Document *)malloc(sizeof(Document));
initDocumentIndex(docnode);
fread(docnode,sizeof(Document),1,fp);//读一篇文档

s=new char[strlen(docnode->doc_content)];
init1(s,strlen(docnode->doc_content));
strcpy(s,docnode->doc_content);
这个时候 ,但不调试,会发现,docnode->doc_content里存放的内容 会包括他后面的全部内容。是什么原因呢 但是有时候还是正确的,具有随机性

因为strcpy 这个函数
一直拷贝docnode->doc_content的内容直到出现'\0'

如果出现随机性 应该是doc_content里面的内容不是以'\0'结尾的
导致后面的内容被读到 除非碰巧后面的内容有'\0'
主要是你没有给出 写数据的函数 不知道 你文档里面到底是如何存放数据的

s=new char[strlen(docnode->doc_content)];
这句 应该多分配一个字节给'\0'; s = new char[.. + 1];
否则s就会不是以'\0'结束的
但前面也说了strcpy不保证dest字符串大小所以这个'\0'也可能被拷贝到s都后面一个字节里去
但这样很危险 越界写操作了

但根据你的描述 会读取后面的成员
那肯定是doc_content也有问题 否则不会读到后面的成员而应该是随机值

总之 你 '\0'问题 基本没考虑