【问题标题】:C++ ofstream line breakC++ ofstream 换行符
【发布时间】:2012-03-31 03:30:15
【问题描述】:

这是我的代码:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream ifile ("input.dat", ios::in);
    ofstream ofile ("output.dat",ios::out);

    int num;
    ifile >> num;
    ofile << num;
    ofile << endl;
    ofile << "Did we go to new line?";
    ofile << endl;

    return 0;
}

问题是,output.dat 中的所有内容都在同一行。我该如何解决这个问题?

谢谢!

编辑:我使用 Windows 查看文件并使用 Linux 进行编译。这就是我遇到这个问题的原因。在 Linux 端使用 cat output.dat 查看文件内容会发现当时 Windows 和 Linux 换行符是不同的。

【问题讨论】:

  • C++ Ofstream a new line的可能重复
  • Inconceivable。你确定 output.dat 只有一行吗?你怎么检查?另外,您使用的是什么操作系统和编译器?
  • 我正在使用 windows 和记事本检查输出文件。
  • +1 为可编译示例。我刚刚使用 VS2010 编译并运行了它,并且换行符正确显示(我的“input.dat”包含“4\n”)。你的编译器是什么?
  • 我们的编译命令是 g++ -Wall source.cpp -o test 我假设我正在使用一个名为 g++ 的编译器?

标签: c++ ofstream line-breaks


【解决方案1】:

std::endl 替换为"\r\n" 以获得CRLF 而不仅仅是LF。

【讨论】:

  • 我建议不要这样做。除了如果你在 Unix 下编写文件,并且你想要 Windows 行结尾,没有太多的选择。 (我想知道是否有人实现了一个 filebuf ,它需要一个额外的格式化选项,以指定应该用于输出的行结束约定。)
  • @JamesKanze :确实,我完全同意,但似乎这就是这里发生的事情。使用 filebuf 会更好,我很想在这里看到它。
  • @JamesKanze 顺便说一句,我怀疑我们的朋友是否可以达到那种程度,并且他有如此广泛的应用程序可以让他的代码工作,他应该尝试filebuf .
  • @g24l 我不建议 OP 写一个新的filebuf:-)。我表达了一种希望,希望某个实现者能以这种方式扩展他的filebuf。 (如果我有一个 filebuf 选项来将 CRLF 转换为单个 '\n' 在 Linux 下会很好。但由于 '\r' 是空格,并且您总是希望允许尾随空格,所以它更少一个问题。)
  • @Pablo @JamesKanze 游戏迟到了,但实现 filebuf 是矫枉过正。毕竟,std::endl 是一个流操作符。类似地,自定义 ostream 操纵器将花费更少的精力和复杂性。
【解决方案2】:

std::endl 已经插入了换行符,因此您的文件中有换行符。我假设您在 LF 系统(Linux 或其他类似 UNIX)上生成文件并在 CRLF 系统上查看它。在这种情况下,您的换行符不会在文本编辑器中显示为换行符。 unix2dos 是你的朋友。

【讨论】:

  • 我正在使用 windows 和记事本检查输出文件。
  • 即使他在Unix下生成,在Windows下阅读,大部分编辑器都会正确显示。如果这是他的问题,那么正确的解决方案是使用不同的编辑器;真正的 Windows 程序将输出 CRLF,但与输入无关(就像真正的 Windows 程序将输出 ` as a path separator, but accept both ` 和 /)。
  • @Pirate43 记事本没用。尝试其他任何方法(甚至是控制台窗口中的type filename)。
  • 如果使用 Cygwin 在 Windows 下运行 gcc,有一个安装选项,可以选择兼容 Windows 或 Unix 的文本文件。
  • @James Kanze 是的,但它只适用于小班作业,而且很容易使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
相关资源
最近更新 更多