2

这有效:

struct client {
    string address;
    int toPay;
    int id;
};

int main() {
    struct client clients[10];
    ...
    file.read( (char*)&clients, sizeof (clients) );
}

我想做的是在函数内部做这些事情。

但是我必须如何将结构传递给函数?

如果我像这样通过它,读取不起作用:

void newFunction ( struct client *clients_t) {
    ...
    file.read( (char*)&clients_t, sizeof (clients_t) );
}
4

5 回答 5

4

这是行不通的,因为string数据没有嵌入到struct. 相反,它有几个指向字符串内容的指针。这就是为什么file.read( (char*)&clients...)不会产生有效结果的原因:string将指向一个保存过的地方string,但它不再代表感兴趣的数据。

如果您想像这样序列化数据,请在 中嵌入整个char数组,struct明显的限制是字符数有上限,并且会浪费一些空间。

于 2012-11-15T18:38:52.660 回答
2

删除通话&中的。file.read()

所以:

file.read((char *)clients_t, sizeof(*clients_t) * 10 );

您正在传递指针本身的地址,但您想要的是结构数组的地址,并传递其正确的大小。

但是,虽然这在read技术上是有效的,但它不会string为您创建对象,因此该片段仅在您在该进程生命周期的早期写出对您自己对象的引用的不寻常情况下才有效。

作为一种学习体验,读写二进制数据是一个好主意。

但是,IRL 通常您根本不想这样做,除非通过 DBMS。它很难调试,并且可以通过公开字节顺序来特定于体系结构。请改用 YAML、XML 或 CSV。

于 2012-11-15T18:36:53.257 回答
1

为什么不简单地在函数中创建一个 struct 对象。它也会这样工作。然后您可以使用您创建的对象访问该函数中结构的成员。

于 2012-11-15T18:36:38.777 回答
1

&clients_t是指向指针的指针。 clients_t是需要的指针。

void newFunction ( struct client *clients_t) {
    ...
    file.read( (char*)clients_t, sizeof (clients_t) );
}
于 2012-11-15T18:37:14.990 回答
1

结构只是一个对象,因此您可以像对待其他对象一样对待它。

void Foo(client& ClientObj)
{
   //anything written in here directly effects the client object you passed
}

请注意,您需要通过引用传递,否则您将只传递对象的副本。

//in main
client CObj;
Foo(CObj);
于 2012-11-15T18:37:49.170 回答