c++ - ofstream 未将 "\r\n"转换为换行符

标签 c++ ofstream

我已经编写了用于更改文件格式的 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"

但是这会按原样打印 record 后跟\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++ - ofstream 未将 "\r\n"转换为换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31311056/

相关文章:

c++ - QT C++ 如何调用lambda one?

c++ - 从自定义目录运行 ctest

C++:辛>> *字符

C++ 查找 ofstream 的大小

c++ - 为什么用std::ofstream写二进制,std::string.c_str()不等于const char*?

c++ - string[] 不是类型吗?

c++ - 项目根目录下的Makefile "no Input Files"

c++ - 我如何使用 switch 而不是 if else 来做到这一点?

c++ - 创建流 vector

c++ - 使用保留文件名返回正值时检查文件是否已创建