簡體   English   中英

如何寫入std :: ostream而不進行格式化?

[英]How to write to std::ostream without formatting?

例如,我想寫std::string my_str( "foobar\\n" ); 字面上進入std::ostream&反斜杠-n完整( 沒有格式化 )。

也許我需要使用格式化函數轉換my_str ,該函數首先將反斜杠轉換為雙反斜杠? 那有標准的庫函數嗎?

或者可能有一個指令我可以傳遞給std::ostream&

對大字符串執行此操作的最簡單方法是使用原始字符串文字:

std::string my_str(R"(foobar\n)");

如果您想要括號,請使用分隔符:

R"delim(foobar\n)delim"

我不知道任何會讓你在字符串中保留轉義代碼等的東西,但輸出它沒有,但std::transformstd::ostream_iterator<std::string>目的地和一個處理你想要的案例應該這樣做,就像在這個例子中一樣

std::string filter(char c) {
   if (c == '\n') return "\\n";
   if (c == '\t') return "\\t";
   //etc
   return {1, c};
}

int main() {
   std::string str{"abc\nr\tt"};
   std::cout << "Without transform: " << str << '\n';

   std::cout << "With transform: ";
   std::transform(std::begin(str), std::end(str), std::ostream_iterator<std::string>(std::cout), filter);
}

由於"foobar\\n"是一個常量字面值,只需將其寫為"foobar\\\\n" ,這樣"\\\\"就變成"\\" ,讓n平靜地離開。

你所謂的“格式化”不是。

流不格式化字符串。 char(10)替換"\\n"是由編譯器在從文字生成實際值時進行的。 (如果底層平台需要,ostream最多將char(10)轉換為{ char(10), char(13) } ,但這是另一個故事)。

這與std::ostreamstd::string無關。 "foobar\\n"是一個文字,其中\\n已經意味着行尾。

您有兩種選擇:

  1. 逃生\\n由符號\\

    std::string str("foobar\\\\n");

  2. 使用現代C ++ 11原始字符串文字

    std::string str(R"(foobar\\n)");

“反斜杠+ n”沒有被流格式化; 例如, std::string("\\n")的長度是1 (而不是2)。 同樣'\\n'是單個字符 寫反斜杠+ n的事實只是表示不可打印(和非ASCII)字符的快捷方式。

另一個例子是'\\x0a' == '\\n' (因為0a是換行符的十六進制代碼)。 並且std::string("\\x0a").size() == 1

如果(在Linux 1上 )你打開一個std::ofstream並將'\\x0a'寫入該流,那么你將得到一個包含單個字節的文件; 其十六進制值為0a

因此,不是您的流正在改變您所寫的內容,而是編譯器。 根據您的用例,您可能希望:

  • 更改代碼中寫入的字符串:使用"foobar\\\\n" (注意這"foobar\\\\n"長度增加1)
  • 在流式處理時執行轉換以打印不可打印字符的十六進制或轉義碼

1在Windows上, '\\n'字符在文本模式下轉換為"\\r\\n" (回車+換行)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM