我编写了一个用于更改文件格式的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";
这是一条记录
但我不能硬编码。我正面临着类似的问题&#34; \ n&#34;还
有关如何操作的任何建议。
答案 0 :(得分:2)
在解析源代码时,编译器将\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个字符:\
,{{1 }},\r
,\
,ASCII n
),这也是您将在输出时获得的字符串。如果它包含ASCII 92 114 92 110
的字符串,那就是你得到的。
当然,如果您将13 10
存储在数据库中是不切实际的,那么没有什么能阻止您存储13 10
(字符串&#34; \ r \ n&#34; )在那里,并在运行时进行翻译。像这样:
92 114 92 110