1

我认为标准库可以在这样的代码中调用模板类型(不是?)的 sizeof 运算符:

#include <fstream>

int main()
{
    std::ofstream file("test.bin", std::ios::binary | std::ios::out);
    char buf = 42;

    file.write(&buf, sizeof(buf));
}

那么是否有理由向程序员询问要写入 ostream::write() 的元素的大小?

PS:这是我的第一个问题,我不是英语,请放纵

4

3 回答 3

1

Achar *可能是

char const c = 'a';
char const * ptr = &c;        // char const *

如您的示例所示,但它也可以是字符串文字

std::string x("some string");
char const * ptr = x.c_str(); // also char const *!!

当您只有可用的指针时,您如何决定您读取的内存地址?你需要一个长度:

file.write(x.c_str(), x.length());
于 2013-08-14T17:06:28.680 回答
0

您无法从指针获取大小。ostream::写

ostream& write (const char* s, streamsize n);

这里s只是指向一个位置,使用sizeof它不会让你知道你需要写多少字节,相反它只会给你指针的大小。

于 2013-08-14T17:06:18.947 回答
0

在不知道元素数量的情况下,您无法找出指向数组的指针的大小。

Sizeof(ptr) 返回平台指针的大小(8 字节)或指向结构的大小,具体取决于使用的运算符。

char * ptr = "abcdef"

printf("%ld", sizeof(ptr));
printf("%ld", sizeof(*ptr));

第一个返回 8(取决于平台),第二个返回 1。即使“正确”大小为 6。

因此,为了知道缓冲区的大小,您必须将大小作为附加参数传递。

出于同样的原因,memset 和 memcpy 要求用户指定指针的大小。

于 2013-08-14T17:07:45.677 回答