【问题标题】:How do I retain a file's formatting when passing its data into a string?将数据传递到字符串时如何保留文件的格式?
【发布时间】:2013-09-14 13:45:44
【问题描述】:

例子:

Test.xml:

<Test>
    This is a test.
</Test>

这是将在每一行中读取并将其添加到“文件”字符串的代码:

std::ifstream infile("Test.xml");
if (infile.is_open()) {
    while (!infile.eof()) {
        std::getline(infile, buffer); // "buffer" variable was created before-hand
        file += buffer;
    }
}

但是当我输出“文件”字符串时,它会出现:

<Test>    This is a test </Test>

当我需要它来保留其格式化属性时。

我很想知道是否有一种方法可以在读取文件时将制表符和换行符分别保留为“\t”和“\n”并将它们插入到字符串中?

【问题讨论】:

  • 您希望输出看起来与输入完全相同,还是希望它的制表符和换行符分别被字符串\t\n 替换?如&lt;Test&gt;\n\tThis is a test.\n&lt;/Test&gt;

标签: c++ file text formatting


【解决方案1】:

std::getline(infile, buffer); 不会包含尾随换行符

你可以使用:

file += buffer + std::string(1,'\n');

使用这个将保留所有换行符。 制表符和空格已经被std::getline(infile, buffer);保留了

【讨论】:

    【解决方案2】:

    getline 的调用会删除新行。所以你可以把它加回来。

    file += buffer;
    file += '\n';
    

    另外,你的循环条件是错误的。 eof 位在您尝试读取之前不会设置,然后因为您已到达文件末尾而失败。这意味着您将添加最后一行两次。您应该将循环条件改为:

    while (std::getline(infile, buffer))
    

    或者,您可以这样做而不是使用循环,一次性读取整个文件:

    std::ostringstream oss;
    oss << infile.rdbuf();
    file = oss.str();
    

    【讨论】:

    • 非常感谢。这很有帮助。
    【解决方案3】:

    Getline() 读取后不包含“\n”符号。为每一行手动添加。

    【讨论】:

      【解决方案4】:
      #include <iostream>
      #include <sstream>
      
      int main() {
          std::istringstream input("Hello\nXML\n");
          std::ostringstream output;
          output << input.rdbuf();
          std::cout << output.str();
          return 0;
      }
      

      上面的代码是从一个流到另一个流的内容副本。 (它适用于任何标准输入/输出流)

      【讨论】:

      • 考虑添加解释。
      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2021-10-24
      • 2012-08-07
      • 1970-01-01
      • 2019-01-12
      • 2011-09-30
      相关资源
      最近更新 更多