[英]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::transform
與std::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::ostream
或std::string
無關。 "foobar\\n"
是一個文字,其中\\n
已經意味着行尾。
您有兩種選擇:
\\n
由符號\\
std::string str("foobar\\\\n");
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.