ofstream 没有将“\r\n”翻译成换行符
ofstream not translating "\r\n" to new line character
我已经编写了用于更改文件格式的 C++ 代码。部分功能是添加配置的行结束符。对于其中一个文件转换,所需的行结束符是“\r\n”,即 CR+NL .
我的代码基本上是从数据库中读取配置值并将其附加到每条记录的末尾。
的内容
//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。
this is a record\r\n
虽然以下工作(在输出文件中打印 CR+LF)
outFileStream<<record;
outFileStream<<"\r\n";
this is a record
但我不能硬编码。我也面临与“\n”类似的问题。
关于如何操作的任何建议。
将 \r
转换为 ASCII 字符 CR 并将 \n
转换为 ASCII 字符 LF 是由 编译器 在解析您的源代码时完成的, 并且仅在文字中。也就是说,字符串文字 "A\n"
将是一个包含值 65 10 0
.
的 3 字符数组
输出流不以任何方式解释转义序列。如果您要求输出流依次写入字符 \
和 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");
我已经编写了用于更改文件格式的 C++ 代码。部分功能是添加配置的行结束符。对于其中一个文件转换,所需的行结束符是“\r\n”,即 CR+NL .
我的代码基本上是从数据库中读取配置值并将其附加到每条记录的末尾。
的内容//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。
this is a record\r\n
虽然以下工作(在输出文件中打印 CR+LF)
outFileStream<<record;
outFileStream<<"\r\n";
this is a record
但我不能硬编码。我也面临与“\n”类似的问题。
关于如何操作的任何建议。
将 \r
转换为 ASCII 字符 CR 并将 \n
转换为 ASCII 字符 LF 是由 编译器 在解析您的源代码时完成的, 并且仅在文字中。也就是说,字符串文字 "A\n"
将是一个包含值 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");