编程C,C ++,Java,PHP,Ruby,图灵,VB
计算机科学加拿大 
编程C,C ++,Java,PHP,Ruby,图灵,VB  

用户名:   Password: 
 登记登记   
 帮助理解此文件I / O示例
指数 -> 编程,C ++ -> C ++帮助
查看上一个主题 可打印的版本下载主题订阅本主题私人信息刷新页面 查看下一个主题
作者 信息
COPTHESAINT.




邮政发布: 2013年2月11日星期一:下午2:27  POST主题:帮助了解此文件I / O示例

我正在在线阅读一个例子I / O,这是链接 来源.

我有几个问题,我希望能够更好地解释。

1:在此示例中使用的朋友函数是否使用过?我看不出在这个功能中有任何直接使用它。它纯粹是典型的吗?

2:当FSTRIM写下类的二进制信息时,写了什么?我必须猜测该类写入何时写入,因此类中对象大小的信息是int的4个3d中奖规则,int的13d中奖规则,但是其他3个3d中奖规则是什么? (假设写入的是源自类的大小。)

谢谢,如果您有助于提供任何清晰度。
赞助
赞助
赞助
赞助
魔鬼




邮政发布: 2013年2月11日星期一7:18 PM  帖子主题:Re:帮助了解此文件I / O示例

朋友 函数上的限定符只是说“此功能可以访问私人成员”,即使在技术上是该功能,操作员<<(ostream&, const ExampleClass&)在技术上没有ostream或exampleeclass的成员函数。

因为它是一个操作员过载,所以它被这行调用:
代码:
COUT.<< c << endl;


就是那个 令人困惑。不,这不是为了得到更好。

by(2),我打算假设你的意思是:
代码:

void write_binary_output_example.()
{
    // ...

    ExampleClass c('C', 3);

    // ...

    // This line, here:
    file.write((char *)(&c), sizeof(c));
}


实际写出来的是......令人惊讶的复杂。您的C ++编译器可以自由地将您的课堂成员重新排列,以任何令人欣慰的方式。这是必需的,因为C ++应该在“跨平台”中工作,并且某些平台需要对内存访问的特定对齐。为了速度,通常优选以特定方式对齐事物。在最常见的X86和X64系统上,4和83d中奖规则的对齐是理想的。有关完整讨论,请参阅: http://en.wikipedia.org/wiki/Data_structure_alignment

长话短说,那条线:
- 意味着一个固有的编译器专用,目标架构特定的,以及对编译标志和#pragma(包)等的敏感性
- 并不意味着从一台计算机到下一个计算机相同的东西,从一个编译器到下一个,跨网络,甚至在同一台计算机上的操作系统之间,使用相同的编译器
- 不必按所需的顺序输出数据

但是,通常,它只在类定义中编写成员变量的内容。对于指针成员,它将写入指针的地址而不是取消引用它并打印其内容。我想引用表现得类似于指针,但我现在不在Linux上,所以我不打算测试它。

例如,如果我打印如下所示的类的实例(给定这些作业):
代码:

类示例{
私人的:
   int a = 3;
   char b = 'b';
   string s = "example";
};


然后输出将包含表示“3”的整数(大endian或小型内部,具体取决于机器; x86计算机上可能4个3d中奖规则,但可能是任何其他数量的比特或3d中奖规则);代表'b'(可能是一个3d中奖规则,在ASCII中,值为98 = 0x62;但是在EBCDIC或任何其他单3d中奖规则编码中潜在地编码;可能,它甚至可以更大或小于一个3d中奖规则,如果目标计算机甚至使用它可能不会的3d中奖规则)。

输出还将包含STD :: String实现的私有成员,这完全取决于使用该标准的实现。我会假设它们将是字符串长度,缓冲区大小和向缓冲区的指针,但它们很容易不同。

这些顺序可以随机洗牌。虽然STD :: String的内容不具有示例::或示例:: b混合到它们中,它们可以订购[a; s; b],[a; b; s],[b; s; a]或任何其他洗牌。此外,字符串本身的内容可能是他们想要的任何顺序。

假设您在x86系统上,那么大概是int的小endian order,char是ascii的4个3d中奖规则,并且是一个3d中奖规则。如果我们假设std :: string打包[大小;长度; buffer *],并且该编译假定43d中奖规则指针,则std :: string可能会消耗12个3d中奖规则(每个尺寸,长度和缓冲区*) 。

如果迫使编译器按照您提供的顺序打包您的结构(通过编译器参数或#pragma的命令),那么磁盘上的结果结构看起来像[a; b; ___; s ::尺寸; s :: length; S :: Buffer *]并且将是20个3d中奖规则长。三倍下划线___表示三个3d中奖规则的“padding”,以使std :: string中的字段是字对齐的。如果它有上面的示例内容,那么它将开始(hex,divided to bytes):03 00 00 00 62 00 00 00 07 00 00 00 00 ??当当当当当当当

最后几个问题标记对应于STD :: String缓冲区的长度,该缓冲区由该特定实现选择,以及指向Char *缓冲区的指针,这取决于我甚至无法在此开始描述它们的许多因素。

更糟糕的是,假设您试图将其用作保存游戏格式。如果从磁盘上读取该结构,则STD :: String使用的指针几乎肯定无效,因此当您尝试访问其内容时,将崩溃您的程序。

这就是为什么二进制格式通常手动写入。
COPTHESAINT.




邮政发布: 2013年2月13日星期三下午3:10  帖子主题:Re:帮助了解此文件I / O示例

无法要求更好的解释,谢谢!
从上一个显示帖子:   
   指数 -> 编程,C ++ -> C ++帮助
查看上一个主题 告诉一个朋友可打印的版本下载主题订阅本主题私人信息刷新页面 查看下一个主题

11  [ 3 Posts ]
跳到:   


Style:  
搜索: