2010-07-28 122 views
0

这里是代码问题提交

#include <iostream> 
#include <fstream> 
#include <cstring> 
using namespace std; 

int main() 
{ 
    ofstream out("test", ios::out | ios::binary); 

    if(!out) { 
    cout << "Cannot open output file.\n"; 
    return 1; 
    } 

    double num = 100.45; 
    char str[] = "www.java2s.com"; 

    out.write((char *) &num, sizeof(double)); 
    out.write(str, strlen(str)); 

    out.close(); 

    return 0; 
} 

我不明白只有这

out.write((char *) &num, sizeof(double)); 

为什么我们需要(char *)&num?sizeof(double)?

+0

出于好奇,是否有什么理由可以在这种情况下使用流插入操作符('operator <<()')?您不必担心使用此类转换。 – Void 2010-07-28 20:53:00

+0

与许多其他问题不同,这是我们可以回答的那种问题 - 相当清晰,真实的代码 - 我是否检测到有多人使用您的帐户? “ – 2010-07-28 20:55:01

回答

3

write有两个参数,一个char*和长度。

&num其实是一个double*。这是我们想要的价值,但它是错误的类型,编译器会抱怨。 (char*)告诉编译器将其视为char*。基本上,它对编译器说:“Shutup。我知道我在做什么”。

sizeof(double)是双字符的大小。 (通常这是8)。

合起来,他们说要写出从& num给出的地址开始的8个字节。 (或换句话说,写出组成num的字节)

+0

”是双字符的大小“。不,它的大小是*字节*。 – 0x499602D2 2014-01-03 19:45:01

+0

实际上并不重要,因为标准要求'sizeof(char)'== 1 – 2014-01-06 02:11:29

+0

“字符”的定义不是'char'。我们如何知道你甚至指的是'char'?你可能指的是'wchar_t'(大多数实现是4字节)或者其他用户定义的类型,就像一个字符。说字节更明确,因为这是度量单位“sizeof”返回值。 – 0x499602D2 2014-01-06 17:03:49

1

您需要它们是因为您正在访问组成double的组件字节。 write预计会收到char *,因此您将地址转换为char *。由于它不知道正在写入的对象的类型(通过正确的转换,write将接受几乎任何指针),因此您需要告诉它构成要写入的对象的字节数。