如何编辑结构的单个成员?例如,我想将entity.name
从 foo 更改为 foobar 。
部分代码:
void editing1(int cnt, int qq)
{
Entity z;
char tempc[255];
int tempi = 0;
cout << "Type in new name: ";
cin >> tempc;
qq--;
Entity* ss = new Entity[cnt];
while (fread(&z, sizeof z, 1, file)) {
ss[tempi] = z;
if (tempi == qq) {
(*ss[tempi].name = *tempc);
};
tempi++;
};
purge();
for (int ii = 0; ii < cnt; ii++) {
fwrite(&ss[ii], sizeof(Entity), 1, file);
};
fclose(file);
system("cls");
};
但我明白了:
它很好......破坏了整个文件。原文:
也有人可以解释为什么它会破坏整个文件而不是使用它的部分?
答案 0 :(得分:1)
这一行是可疑的......
(*ss[tempi].name=*tempc);
请注意,ss
是指向cnt
Element
数组的指针 - 因此,如果要访问tempi
元素,请使用正确的方法不是(*ss[tempi])
而是ss[tempi]
- 如果您尝试访问name
属性的第一个元素,那么*ss[tempi].name
会这样做。
但是,tempc
是一个char数组,没有数组索引,是数组中第一个元素的地址。 *tempc
将是第一个字节中的单个字符。
问题在于我不知道ss[tempi].name
是什么,以便告诉您分配它的正确方法。这将是我的解决方案如果 name
是一个字符指针。
ss[tempi].name=tempc;
如果name
是一个char数组,你可能会想要这样的东西......
strncpy( ss[tempi].name, tempc, sizeof( ss[tempi].name ) );
*ss[tempi].name
是name
中的第一个字符 - 如您所述,该属性为char name[255]
- 因此,name
本身就是第一个字符的地址该数组中的字符*name
是实际的第一个字符。 *tempc
也是如此 - 所以,您要将tempc
的第一个字节复制到name
,这就是全部。
此外,您无法通过分配数组来复制数组......
char array1[255] = "hello world";
char array2[255];
array2 = array1;
不合法C
。您需要使用字符串副本来执行此操作,并且还需要防止缓冲区溢出,因此您将执行此操作...
char array1[255] = "hello world";
char array2[255];
strncpy( array2, array1, sizeof( array2 ) );
答案 1 :(得分:0)
*ss[tempi].name
应该是
ss[tempi].name