Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将结构传递给函数 这项工作:_C++_C_Struct_Binary - Fatal编程技术网

C++ 将结构传递给函数 这项工作:

C++ 将结构传递给函数 这项工作:,c++,c,struct,binary,C++,C,Struct,Binary,我想做的是在函数内部做这些事情 但是我如何将结构传递给函数呢 如果我通过了这样的考试,阅读不起作用: void newFunction ( struct client *clients_t) { ... file.read( (char*)&clients_t, sizeof (clients_t) ); } 为什么不在函数中创建一个struct对象呢。 这样也行。 然后,您可以使用创建的对象访问该函数中的结构成员。删除文件.read()中的&调用 因此: 您正在传递指

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

但是我如何将结构传递给函数呢

如果我通过了这样的考试,阅读不起作用:

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

为什么不在函数中创建一个struct对象呢。 这样也行。
然后,您可以使用创建的对象访问该函数中的结构成员。

删除
文件.read()中的
&
调用

因此:

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

然而,尽管这使得
读取
在技术上是有效的,但它不会为您创建
字符串
对象,因此该片段仅在异常情况下有效,即您在该进程的生命周期中较早地写出了对自己对象的引用

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


然而,IRL通常你根本不想做,除非是通过DBMS。它很难调试,并且可以通过公开字节顺序而特定于体系结构。请考虑YAML、XML或CSV。

&clients\u t
是指向指针的指针。
clients\t
是一个指针,它是必需的

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

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

void Foo(client& ClientObj)
{
   //anything written in here directly effects the client object you passed
}
请注意,您需要通过引用传递,否则只传递对象的副本

//in main
client CObj;
Foo(CObj);

这是行不通的,因为
字符串
数据未嵌入
结构
。相反,它有两个指向字符串内容的指针。这就是为什么
file.read((char*)&clients…)不会产生有效结果的原因:
字符串将指向保存的
字符串一旦指向的位置,但它将不再表示感兴趣的数据


如果你想像那样序列化数据,在
结构中嵌入一个完整的
char
数组,明显的限制是字符数和一些浪费的空间。

只需将参数更改为struct client&clients\u t你能提供file.read的签名吗“string”是什么你用什么?是std::string吗?顺便说一句,您真的不应该简单地将结构转储到文件中。您应该为结构构造序列化和反序列化方法。以受控的方式显式地在
char
数组之间进行转换。你应该把那5个额外的字符打出来<代码>std::
没有那么长,它使您的代码更加清晰,而且当您碰巧使用了出现在
std
中的函数名时,您不必排除非常奇怪的随机编译时或运行时错误。我想我应该删除该符号,但我认为我不需要在sizeof后面加星号我必须尽快提高我的指针知识。终于有人说了。好吧,那我就检查一下你的P
void Foo(client& ClientObj)
{
   //anything written in here directly effects the client object you passed
}
//in main
client CObj;
Foo(CObj);