簡體   English   中英

ofstream不會將“ \\ r \\ n”轉換為換行符

[英]ofstream not translating “\r\n” to new line character

我已經編寫了用於更改文件格式的C ++代碼。 功能的一部分是添加已配置的行結束符。 對於文件轉換之一,所需的行尾字符為“ \\ r \\ n”,即CR + NL。

我的代碼基本上從DB讀取配置的值,並將其附加到每個記錄的末尾。 一些東西

//read DB and store line end char in a string lets say lineEnd.
//code snippet for file writting
string record = "this is a record";

ofstream outFileStream;
string outputFileName = "myfile.txt";
outFileStream.open (outputFileName.c_str());
outFileStream<<record;
outFileStream<<lineEnd; // here line end contains "\r\n"

但是此打印記錄后跟着\\ r \\ n,不會轉換為CR + NL。

這是一條記錄\\ r \\ n

當以下工作時(在輸出文件中打印CR + LF)

outFileStream<<record;
outFileStream<<"\r\n";

這是一個記錄

但是我不能硬編碼它。 我也遇到與“ \\ n”類似的問題。

關於如何做的任何建議。

編譯器在解析源代碼時只能將\\r轉換為ASCII字符CR,將\\n轉換為ASCII字符LF,並且只能轉換為文字。 也就是說,字符串文字"A\\n"將是一個3字符數組,其值為65 10 0

輸出流不會以任何方式解釋轉義序列。 如果您要求輸出流將字符\\r互相寫,則會這樣做(寫ASCII值92和114的字符)。 如果要求它寫入字符CR(ASCII代碼13),它將這樣做。

原因std::cout << "\\r"; 寫CR字符是字符串文字已經包含字符13。因此,如果您的數據庫包含字符串\\r\\n (4個字符: \\\\r\\n ,ASCII 92 114 92 110 ),也就是字符串,您將獲得輸出。 如果它包含帶有ASCII 13 10的字符串,那么您將得到。

當然,如果將13 10存儲在數據庫中是不切實際的,則沒有什么可以阻止您將92 114 92 110 (字符串“ \\ r \\ n”)存儲在其中,並在運行時進行翻譯。 像這樣:

void translate(std::string &str, const std::string &from, const std:string &to)
{
  std::size_t at = 0;
  for (;;) {
    at = str.find(from, at);
    if (at == str.npos)
      break;
    str.replace(at, from.size(), to);
  }
}


std::string lineEnd = getFromDatabase();
translate(lineEnd, "\\r", "\r");
translate(lineEnd, "\\n", "\n");

暫無
暫無

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

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