C++中的ofstream换行

8
这是我的代码:

#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的换行符在此时是不同的。

2
可能是C++ Ofstream a new line的重复问题。 - karlphillip
2
“不可思议”(Inconceivable)(http://www.youtube.com/watch?v=1-b7RmmMJeo)。你确定 "output.dat" 只有一行吗?你是如何检查的?还有,你使用的操作系统和编译器是什么? - Robᵩ
我正在使用Windows和记事本来检查输出文件。 - Pablo Canseco
1
我刚刚使用VS2010编译并运行了这个程序,换行符显示正确(我的“input.dat”文件包含“4\n”)。你用的是什么编译器?+1 如果提供可编译的示例。 - hmjd
我们的编译命令是 g++ -Wall source.cpp -o test。我假设我正在使用一个名为 g++ 的编译器? - Pablo Canseco
作为参考,您在哪里运行 g++?以及您在哪里运行程序?在 Linux 系统上?还是在使用 Cygwin 的 Windows 系统上? - user1084944
2个回答

7

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


5
我建议不要这样做。但如果你正在Unix下编写文件,并且想要使用Windows的换行符,那么没有太多选择。(我在想是否有人已经实现了一个filebuf,它可以采用附加格式选项来指定应用于输出的换行符约定。) - James Kanze
@JamesKanze:确实,我完全同意,但似乎这就是这里发生的事情。使用filebuf更好,我很想在这里看到它。 - user677656
顺便提一下,我怀疑我们的朋友是否能够到那种程度,并且他是否有这么广泛的应用程序来让他的代码工作,他应该尝试使用filebuf - user677656
@g24l 我并不是在建议 OP 写一个新的 filebuf :-). 我只是表达了一种希望,希望某个实现者能够以这样的方式扩展他的 filebuf。(如果在 Linux 下有一个将 CRLF 转换为单个 '\n'filebuf 选项也会很好。但由于 '\r' 是空格,而且你总是想允许尾随空格,所以这不是一个大问题。) - James Kanze
@Pablo @JamesKanze 晚来一步,但实现filebuf是杀鸡焉用牛刀。毕竟,std::endl是一个流操纵器。同样,自定义ostream操纵器所需的工作量要少得多,也会更简单。 - Spencer

2

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


我正在使用Windows和记事本来检查输出文件。 - Pablo Canseco
3
即使他在Unix下生成并在Windows下读取,大多数编辑器仍然可以正确地显示它。如果这是他的问题,正确的解决方案是使用不同的编辑器;真正的Windows程序将输出CRLF,但对于输入是不可知的(就像真正的Windows程序将\作为路径分隔符输出,但接受\/两种形式)。 - James Kanze
2
@Pirate43 记事本没什么用。试试其他任何东西(甚至从控制台窗口输入 type 文件名)。 - James Kanze
1
如果在Windows下使用Cygwin运行gcc,则有安装选项可选择Windows或Unix兼容的文本文件。 - Bo Persson
@James Kanze 确实,但这只是一个小型课程作业,而且很容易使用。 - Pablo Canseco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接