使用非標準區域設定編寫檔案

如果你需要使用不同的區域設定將檔案寫入預設值,則可以使用 std::localestd::basic_ios::imbue() 為特定檔案流執行此操作:

使用指南:

  • 在開啟檔案之前,應始終將本地應用於流。
  • 一旦流被灌輸,你就不應該更改區域設定。

限制的原因: 如果當前區域設定不是獨立狀態或未指向檔案的開頭,則使用區域設定阻塞檔案流具有未定義的行為。

UTF-8 流(和其他)不是狀態獨立的。此外,具有 UTF-8 語言環境的檔案流可以在檔案開啟時嘗試從檔案中讀取 BOM 標記; 所以只是開啟檔案可能會讀取檔案中的字元,而不會在開頭。

#include <iostream>
#include <fstream>
#include <locale>

int main()
{
  std::cout << "User-preferred locale setting is "
            << std::locale("").name().c_str() << std::endl;

  // Write a floating-point value using the user's preferred locale.
  std::ofstream ofs1;
  ofs1.imbue(std::locale(""));
  ofs1.open("file1.txt");
  ofs1 << 78123.456 << std::endl;

  // Use a specific locale (names are system-dependent)
  std::ofstream ofs2;
  ofs2.imbue(std::locale("en_US.UTF-8"));
  ofs2.open("file2.txt");
  ofs2 << 78123.456 << std::endl;

  // Switch to the classic "C" locale
  std::ofstream ofs3;
  ofs3.imbue(std::locale::classic());
  ofs3.open("file3.txt");
  ofs3 << 78123.456 << std::endl;
}

如果你的程式使用不同的預設語言環境並且你希望確保讀取和寫入檔案的固定標準,則顯式切換到經典 C 語言環境非常有用。這個例子寫了一個 C 首選語言環境

78,123.456
78,123.456
78123.456

例如,如果首選語言環境是德語,因此使用不同的數字格式,則示例寫入

78 123,456
78,123.456
78123.456

(注意第一行中的小數逗號)。