- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读 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 bys
. 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_cast
到 char*
?在写入流时,我什么时候应该知道做类似的事情?
如果有人能帮我解决这两个问题,将不胜感激。
最佳答案
•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/
我的 friend 给我发了一个代码,他说在 Windows 中成功编译。我在linux上尝试过,但未能给出以下错误。下面是代码的最小可验证示例。 #include #include using
搜索这个问题的标题给了我很多人引用相同的错误,但在不同的情况下,不幸的是那里提供的答案是针对他们的情况的,我看不出他们能如何帮助我。 我正在尝试重载 operator template class
我已经看过几个关于这个的问题,特别是 Overloading operator&&’很有帮助。它让我知道我的问题是我正在做一些 c++11 无法从中推断出类型的事情。 我认为我的问题的很大一部分是我正
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
在这段代码中,我尝试将迭代器移动 10 个元素。 #include #include #include int main() { using
你好everonye即使我在这里找到了很多关于这个问题的答案,但一个人根本无法向我解释事情的进展如何无法解决它。 所以我的问题是我有一个名为 Matrix 的类,当我尝试将运算符 }’ lvalue
如何在 C++ 中打印 high_resolution_clock? #include #include typedef std::chrono::high_resolution_clock hi
关于这个标题的 StackOverflow 有很多关于这个标题的问题,但没有一个对我有帮助,我真的不明白发生了什么。 我正在尝试创建一个生成随机单词的类。首先,我尝试将所有元音和辅音放在两个不同的 s
我在尝试做一些简单的事情时遇到了一个令人困惑的错误消息 std::cout {1,2,3}; 上面写着 cannot bind 'std::ostream {aka std::basic_ostre
我在尝试编译我的代码时遇到此错误: 1> c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/ostream: In constructor 'Log
我想知道如何在 std::basic_ostream 中插入参数我一直在努力,但我做不到 我需要插入一个参数来选择我想要打印的 arista 值一旦我插入了参数,下一步就很容易了,因为它只是一个 if
根据 cppref , 有一个 operator 过载接受 const char* .似乎转换操作只是加宽了每个 char进入 wchar_t .也就是说,转换(插入)的宽字符数等于窄字符数。那么问
为什么使用用户定义的类进行流操作的典型 header C通常是这样的: std::ostream& operator>(std::istream& is, C&); 不是这样的: template
我想提供一个流运算符来输出 std::chrono::time_point 作为 GMT 日期,我目前有以下内容(仅针对 ostream 进行了简化): using datetime_t = std:
我正在阅读 basic_ostream 对象的 write 方法,这是我在 cppreference 上找到的内容: basic_ostream& write( const char_type* s,
这个问题在这里已经有了答案: Misunderstanding about ostream class and operator << (5 个答案) 关闭 8 年前。 标题是我的问题。 basic
我收到以下错误,我不确定是什么问题 1 IntelliSense: "std::basic_ostream::basic_ostream(const std::basic_ostream::_Myt
上面有转换吗? 最佳答案 将std::string 转换为输出 流?通常是:将字符串转换为从给定字符串中读取字符的输入流: std::string myString = //... std::istr
就在我认为我了解 C++11 中 iostream 的多遍移动构造时(感谢 https://stackoverflow.com/a/8156356/273767 的介绍),我遇到了这个: §27.7.
§27.7.3.9为 operator basic_ostream& operator&& os, const T& x); Effects: os > 的右值重载。) 基本上,它只是转发到左
我是一名优秀的程序员,十分优秀!