public member function
<ostream> <iostream>

std::basic_ostream::write

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

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

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

参数

s
指向至少包含 n 个元素的数组的指针。
成员类型 char_type 是流使用的字符类型(即其第一个类模板参数 charT)。
n
要插入的字符数。
类型为 streamsize 的整数值,表示要写入的数据块的字符大小。
streamsize 是一个带符号整型。

返回值

basic_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 个字符。
修改流对象。
对同一流对象的并发访问可能导致数据竞争,标准流对象(coutcerrclogwcoutwcerrwclog)除外,当这些流对象与 stdio 同步 时(在这种情况下,不会发生数据竞争,尽管不保证来自多个线程的字符插入顺序)。

异常安全

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

另见