12

我有以下代码,在 Suse 10.1 / G++ 4.1.0 上运行,它不写入文件:

#include <fstream>
#include <iostream>

int main(){
    std::ofstream file("file.out");
    file << "Hello world";
}

该文件已正确创建并打开,但为空。如果我将代码更改为:

#include <fstream>
#include <iostream>

int main(){
    std::ofstream file("file.out");
    file << "Hello world\n";
}

\n(在文本中添加一个),它有效。我也试过冲洗ofstream,但没有用。

有什么建议么?

4

5 回答 5

10

如果你检查你的文件cat,它可能是你的 shell 配置错误,如果没有行尾,则不会打印该行。
std::endl添加一个\n 冲洗。

于 2010-06-24T19:27:27.717 回答
5

不知道这是否是您尝试过的,但您应该这样做:

file << "Hello World" << std::flush;

更新由于有用的评论,我将这个答案留在这里

根据反馈,我将修改我的建议:您不必显式调用std::flush(或file.close()就此而言),因为析构函数会为您执行此操作。

此外,显式调用 flush 会强制执行可能不是最优化方式的 I/O 操作。推迟到底层 iostream 和操作系统会更好。

显然,OP 的问题与调用或不调用无关std::flush,可能是由于在调用文件流析构函数之前尝试读取文件。

于 2010-06-24T19:24:25.180 回答
5

析构函数应该刷新并关闭文件。

我很确定,错误是另一个地方,要么

1)您没有在正确的时间点进行检查。在什么时候比较文件的内容,“之后”退出,还是在程序退出之前设置断点然后检查文件内容?

2)程序在退出之前以某种方式崩溃?

于 2010-06-24T19:55:33.260 回答
0

file << "Hello world" << std::endl;

工作?

endl 插入换行符并刷新缓冲区。当你说你已经尝试过冲洗它时,这就是你所指的吗?

于 2010-06-24T19:24:01.657 回答
0

您正在使用符合 POSIX 的系统 Linux。POSIX 标准定义了是什么:

零个或多个非换行符加上终止换行符的序列。

因此,如果没有换行符,文件包含 0 行,因此为空。

于 2018-05-16T13:49:27.233 回答