gpt4 book ai didi

c++ - 关于 std::basic_ostream::write

转载 作者:太空狗 更新时间:2023-10-29 21:23:59 24 4
gpt4 key购买 nike

我正在阅读 basic_ostream 对象的 write 方法,这是我在 cppreference 上找到的内容:

basic_ostream& write( const char_type* s, std::streamsize count );

Behaves as an UnformattedOutputFunction. After constructing and checking the sentry object, outputs the characters from successive locations in the character array whose first element is pointed to by s. Characters are inserted into the output sequence until one of the following occurs:

  • exactly count characters are inserted
  • inserting into the output sequence fails (in which case setstate(badbit) is called)

所以我知道它将缓冲区中的一大块字符写入流中。字符数为count指定的字节数。但有几件事我不确定。这些是我的问题:

  • 仅当我想指定要写入流的多少 字节时,才应该使用write 吗?因为通常当您打印 char 数组时,它会打印整个数组,直到它到达空字节,但是当您使用 write 时,您可以指定要写入的字符数。

    char greeting[] = "Hello World";

    std::cout << greeting; // prints the entire string
    std::cout.write(greeting, 5); // prints "Hello"

    但也许我误解了这个。

  • 我经常在使用 write 的代码示例中看到这一点:

    stream.write(reinterpret_cast<char*>(buffer), sizeof(buffer));

    为什么要使用 reinterpret_castchar*?在写入流时,我什么时候应该知道做类似的事情?

如果有人能帮我解决这两个问题,将不胜感激。

最佳答案

•Should I use write only when I want to specify how many bytes I want to write to a stream?

是的 - 你应该使用 write当您希望按顺序将特定数量的数据字节连续排列在内存中时。但有时您可能需要特定数量的字节并需要以其他方式获取它们,例如通过格式化 double的 ASCII 表示具有特定的宽度和精度。

其他时候您可能会使用 >> ,但是对于非内置类型,它必须是用户定义的,并且当它被定义时——通常是为了更好,但对你的目的来说可能更糟——它打印类设计者选择的任何内容,包括通过指针从对象链接的潜在数据或感兴趣的引用和静态数据,和/或动态计算的值。它可能会改变数据表示:比如转换二进制 double s 到 ASCII 表示,或确保网络字节顺序,而不管主机的字节顺序如何。它还可能会省略一些对象的数据,例如缓存条目、用于管理但不是逻辑部分数据的计数器、未填充的数组元素等。

Why is the reinterpret_cast to char* being use? When should I know to do something like that when writing to a stream?

write()函数签名需要 const char*参数,所以这个转换正在完成。每当您无法获得 char* 时,您都需要使用强制转换。到数据。

投映方式write()将从对象的第一个字节开始的数据视为 8 位值,而不考虑数据的实际预制类型。这与能够做像 write() 这样的事情有关。 float 的最后一个字节和 double 的前 3 个字节在相同的结构中出现下一个 - 在 reinterpret_cast<> 之后所有数据边界和解释都丢失了.

(当从输入流中执行 read() 字节时,你实际上必须更加小心......假设你读取构成 double 的数据写入内存时未正确对齐double ,然后尝试将其用作 double ,您可能会从 CPU 获得 SIGBUS 或类似的对齐异常,或者性能下降,具体取决于您的系统。)

关于c++ - 关于 std::basic_ostream::write,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17077901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com