从单个项目的多个.cpp文件到同一文本文件的流输出 亲爱的所有:我有一个C++项目(VisualStudio 2008),它包含了包含Head()和SooCuy2.2.CPP文件的Health.h,SooCuy1.1.CPP文件。

从单个项目的多个.cpp文件到同一文本文件的流输出 亲爱的所有:我有一个C++项目(VisualStudio 2008),它包含了包含Head()和SooCuy2.2.CPP文件的Health.h,SooCuy1.1.CPP文件。,c++,file-io,C++,File Io,在程序中的某些时候,我需要将一些中间结果输出到一个文本文件中,比如“output.txt”。问题是,我不能这样做。也就是说,我无法从source_1.cpp和source_2.cpp将结果输出到同一个“output.txt”文件中。我一直在使用ofstream进行文件写入操作 例如,在source_1.cpp中,我说过 ofstream ofile("output.txt"); 后来在代码中我会说 ofile<<"Result of intermediate calculation

在程序中的某些时候,我需要将一些中间结果输出到一个文本文件中,比如“output.txt”。问题是,我不能这样做。也就是说,我无法从source_1.cpp和source_2.cpp将结果输出到同一个“output.txt”文件中。我一直在使用ofstream进行文件写入操作

例如,在source_1.cpp中,我说过

ofstream ofile("output.txt");
后来在代码中我会说

ofile<<"Result of intermediate calculation are "<<intermediate_result<<endl;
(同一对象已在多个位置定义时出错。)

然后我试着用source_2.cpp说

ofstream ofile_2("output.txt");//Note ofile_2 which is different from ofstream ofile in source_1.cpp
但是,在source_2.cpp中使用ofile_2最终会删除由ofile在source_1.cpp中写入的文件的任何以前的输出

为了从两个不同的.cpp文件写入同一个文件,我是否应该使用ofstream以外的东西


谢谢。

问题的核心是,您使用两个不同的文件句柄写入同一个文件。如果按顺序执行,这没有问题。如果要附加到文件,必须按如下方式打开:

std::ofstream file("output.txt", std::ios_base::out | std::ios_base::app)
这将告诉流的
附加到文件中


为了避免编译单元之间的命名冲突,您可以使用。

最佳方法:将类型为
ostream&
的实例传递给所有需要输出结果的客户端。我建议不要试图定义一个对任何人都可见的全局静态对象。

每次使用相同的文件名字符串构造流的
,它都会覆盖已经存在的内容

将流的
封装在一个类中,该类构造它一次,然后使用此包装类的全局可访问实例上的成员从其他类写入。如果您不总是想写出此文件,则该类可以在第一次请求写入时调用
open()

或者(更快但混乱)只需在全局范围内声明一个流的
,供所有人使用

我通常不鼓励任何形式的全局可见数据,但日志文件是其中一种有意义的情况

您可能需要实现互斥来调解并发写入。另一个用于将流的
封装在
FileWriter
类或类似类中的参数。如果不这样做,您可能会发现来自一个线程的数据与来自另一个线程的数据混淆地交织在一起


如果你期望日志记录需要变得更复杂,你可以考虑而不是在逻辑的外围区域增加越来越多的时间。

是的,我将尝试在Health.h中定义Ifter()流,并且包括SoeCy1.1.CPP和SooSux2.CPP中的这个头。希望这能起到作用…谢谢。@Tryer-这可能不会链接。您只需声明一次,并在链接的一个代码文件中定义它,就不会找到DUP。是的,通过引用传递ofstream对象就足够了。这不是最好的方法。见比约恩·波利克斯的答案。使用
ios::append
打开文件。
std::ofstream file("output.txt", std::ios_base::out | std::ios_base::app)