ofstream不刷新缓冲区

13

我有以下代码,在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,但不起作用。

有什么建议吗?


2
你如何检查生成的文件? - log0
1
在Debian/Sid上,使用g++ 4.4.4编译的程序按预期工作,并且file.out包含字符串(无换行符)。尝试更新您的编译器或操作系统 - 两者都已过时。 - Dummy00001
1
你是如何检查文件是否为空的?对结果文件执行以下操作:wc <file>,看看输出是什么。应该是0 2 11。0行,2个单词,11个字符。如果没有换行符,输出的“Hello world”将进入您的提示符,因此您可能会忽略它。 - Louis Marascio
5个回答

10

如果您使用 cat 命令检查文件,可能是您的 shell 配置错误,如果没有行结束符,则不打印该行。
std::endl 添加了一个 \n 以及刷新操作。


4
是的,尝试执行“cat file ; echo”命令。不过不要盲目使用“endl”。我讨厌使用那种愚蠢结构的代码,希望标准制定人员能将其从标准中移除。刷新操作很耗费资源,应该有意识地、审慎地进行。 - Omnifarious
1
问题出在我工作中使用的有缺陷的编辑器上,如果没有'\n'结尾,它就不会显示该行。显然,vi编辑器可以正确显示。 - kinslayer_e

6

不知道你尝试过没有,但你应该这样做:

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

更新; 因为评论很有用,我将保留此答案

根据反馈,我将修改我的建议:您不应该明确调用 std::flush (或 file.close() ),因为析构函数会为您执行此操作。

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

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


3
ofstream 的析构函数应该自动刷新。 - Omnifarious
1
@John Weldon - 这是错误的,因为它实际上没有解决问题的本质。它可能在调试和查找真正问题时有用(因此应该作为注释),但本身并不是解决方案。如果它被认为是一种解决方案,那么它表明了一种像货物崇拜一样的解决方案,其中人们会插入代码,而不知道为什么需要它。 - Omnifarious
当然,其他人也没有真正提出解决方案。所有的答案基本上都是调试建议。但大多数至少被措辞为调试建议。如果它没有得到赞成票或者被措辞为调试建议而不是解决方案,我就不会给它点踩了。 - Omnifarious
1
@John Weldon,我不会同意你这样做。清空缓存是一项实现细节。文件的概念模型是你使用<<运算符向其中写入内容。在所有合理的情况下,ofstream都要负责维护这个模型。只有在特定情况下,我需要实际文件和ofstream呈现的模型在某个时间点匹配时,才需要去调整实现细节。 - Omnifarious
这是错误的,因为它暗示了 ofstream 的析构函数不会刷新,而实际上它确实会刷新。 - Johannes Schaub - litb
显示剩余3条评论

5

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

我相信错误出现在另一个地方,要么

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

2)某种情况下程序在退出之前崩溃了?


是的,如果按照给定的程序运行,等待它完全完成并返回提示符后,数据仍然不存在,那么就说明有bug出现在某个地方。 - Omnifarious

0

这个

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

工作?

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


0
你正在使用的是符合 POSIX 标准的 Linux 操作系统。POSIX standard 定义了什么是行:

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

因此,如果没有换行符,文件中不包含任何行,因此为空。


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