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) );
}
答案 0 :(得分:4)
这不起作用,因为string
数据未嵌入struct
。相反,它有一些指向字符串内容的指针。这就是为什么file.read( (char*)&clients...)
不会产生有效结果的原因:string
将指向保存的string
一旦指出的位置,但它将不再代表感兴趣的数据。
如果你想序列化这样的数据,在char
中嵌入一个完整的struct
数组,明显的限制是字符数量上限和一些浪费的空间
答案 1 :(得分:2)
移除&
来电中的file.read()
。
所以:
file.read((char *)clients_t, sizeof(*clients_t) * 10 );
您正在传递指针本身的地址,但您想要的是结构数组的地址,并传递其正确的大小。
但是,虽然这使得read
在技术上有效,但它不会为您创建string
个对象,因此该片段仅适用于您已写出对您的引用的异常情况在该过程的生命周期的早期拥有对象。
作为一种学习经历,阅读和编写二进制数据是一个好主意。
但是,IRL通常你根本不想这样做,除非是通过DBMS。它很难调试,并且可以通过公开字节顺序来特定于体系结构。改为使用YAML,XML或CSV。答案 2 :(得分:1)
为什么不在函数中简单地创建struct的对象。 它也会这样工作。 然后,您可以使用您创建的对象访问该函数中的结构成员。
答案 3 :(得分:1)
&clients_t
是指向指针的指针。
clients_t
是一个指针,它是必需的。
void newFunction ( struct client *clients_t) {
...
file.read( (char*)clients_t, sizeof (clients_t) );
}
答案 4 :(得分:1)
结构只是一个对象,所以你就像处理其他对象一样对待它。
void Foo(client& ClientObj)
{
//anything written in here directly effects the client object you passed
}
注意你需要通过引用传递,否则你只会传递对象的副本。
//in main
client CObj;
Foo(CObj);