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 時被設定,則該函式將重新引發捕獲到的異常。

另見