在两行上打印类似 "First\nSecond" 的字符串

Print a string like "First\nSecond" on two lines

目标: 从文件中读取 First\nSecond 形式的字符串并将其打印为

 First
 Second

问题:如果在代码中定义了字符串,如line = "First\nSecond";,则分两行打印;如果相反,我从文件中读取它,则打印为

First\nSecond

说明问题的短程序:

#include "stdafx.h"     // I'm using Visual Studio 2008
#include <fstream>
#include <string>
#include <iostream>

void main() {
  std::ifstream ParameterFile( "parameters.par" ) ;
  std::string line ;
  getline (ParameterFile, line) ;
  std::cout << line << std::endl ;
  line = "First\nSecond";
  std::cout << line << std::endl ;

  return;
}

parameters.par 文件仅包含行

First\nSecond

Win32 控制台输出为

C:\blabla>SOtest.exe
First\nSecond
First
Second

有什么建议吗?

在 C/C++ 字符串文字 ("...") 中,反斜杠用于标记所谓的 "escape sequences" 特殊字符。 编译器 翻译(替换)两个字符'\'(ASCII码92)后跟'n'(ASCII码110)换行符(ASCII 码 10)。在文本文件中,通常只需按下 [RETURN] 键即可插入换行符。如果你真的需要处理包含两个字符 '\' 和 'n' 的输入,并且想像 C/C++ 编译器一样处理它们,那么你必须明确地用换行符替换它们:

replace(line, "\n", "\n");

你必须提供这样的替换函数: Replace part of a string with another string(标准 C++ 本身不提供这样的替换函数。)

C/C++ 和类似编译器支持的其他转义序列:

  • \t -> [TAB]
  • \" -> "(以区别于普通的 ",后者标记字符串文字的结尾,但不是字符串本身的一部分!)
  • \\ -> \(允许在字符串文字中使用反斜杠;单个反斜杠开始转义序列)

转义序列 \n 在字符串文字中指示的字符与看起来像 \n!

的字符序列不同

当您认为自己正在分配 First\nSecond 时,您并不是。在您的源代码中,字符串文字中的 \n 是不可见换行符的 "shortcut" 。该字符串不包含 \n - 它包含换行符。它会自动为您转换。

而您从文件中读取的是实际字符 \n