public member function
<ostream> <iostream>

std::ostream::write

ostream& write (const char* s, streamsize n);
写入数据块
将指针 s 指向的数组中的前 n 个字符插入流中。

此函数仅复制数据块,而不检查其内容:该数组可能包含空字符,这些字符也会被复制,而不会停止复制过程。

在内部,该函数通过首先构造一个 sentry 对象来访问输出序列。
然后(如果 good),它会像调用其成员函数 sputc 一样将字符插入其关联的 流缓冲区 对象,直到写入 n 个字符或直到插入失败(在这种情况下,它会设置 badbit 标志)。
最后,它会在返回前销毁 sentry 对象。
在内部,该函数通过首先构造一个 sentry 对象来访问输出序列。
然后(如果 good),它会像调用其成员函数 sputcsputn 一样将字符插入其关联的 流缓冲区 对象,直到写入 n 个字符或直到插入失败(在这种情况下,它会设置 badbit 标志)。
最后,它会在返回前销毁 sentry 对象。

参数

s
指向至少包含 n 个字符的数组的指针。
n
要插入的字符数。
类型为 streamsize 的整数值,表示要写入的数据块的大小(以字符为单位)。
streamsize 是一个带符号整型。

返回值

ostream 对象 (*this)。

错误通过修改 *内部状态标志* 来发出信号。
flagerror
eofbit-
failbit如果 sentry 的构造失败,则可能设置此标志。
badbit流上的插入失败,或者发生了其他错误(例如,当此函数捕获由内部操作引发的异常时)。
设置时,流的完整性可能受到影响。
一次操作可能设置多个标志。

如果操作设置了一个已通过成员 exceptions 注册的 内部状态标志,则该函数将引发类型为 failure 的成员异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Copy a file
#include <fstream>      // std::ifstream, std::ofstream

int main () {
  std::ifstream infile ("test.txt",std::ifstream::binary);
  std::ofstream outfile ("new.txt",std::ofstream::binary);

  // get size of file
  infile.seekg (0,infile.end);
  long size = infile.tellg();
  infile.seekg (0);

  // allocate memory for file content
  char* buffer = new char[size];

  // read content of infile
  infile.read (buffer,size);

  // write to outfile
  outfile.write (buffer,size);

  // release dynamically-allocated memory
  delete[] buffer;

  outfile.close();
  infile.close();
  return 0;
}

此示例将文件复制到内存中,然后将其内容写入新文件。

数据竞争

访问指针 s 指向的最多 n 个字符。
修改流对象。
对同一流对象的并发访问可能导致数据竞争,除非是标准流对象(coutcerrclog),并且这些对象与 stdio 同步(在这种情况下,不会引发数据竞争,尽管不能保证来自多个线程的字符的插入顺序)。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果生成的 错误状态标志 不是 goodbit 并且成员 exceptions 被设置为针对该状态进行引发,则它将引发类型为 failure 的成员异常。
由内部操作引发的任何异常都会被该函数捕获和处理,并设置 badbit。如果 badbit 在上次调用 exceptions 时被设置,则该函数将重新引发捕获到的异常。

另见