如何使用 ofstream 从两个不同的文件写入单个文件(从流 class 创建)

how to write into a single file (create from stream class) from two different files using ofstream

我正在使用 ofstream 写入文件。

ofstream myfile;
myfile.open("test.txt",ios::app);

现在,我希望这个变量 "myfile" 被两个不同的文件使用。 eg:example.cc 和 example1.cc

我已经在 example.cc 文件中声明了 'myfile',并且在调用转到 example1.cc 的函数调用之后,我使用相同的名称 'myfile ' 来编写到同一个文件 test.txt。 但是我收到错误

#example1.cc 'myfile' was not declared in the scope

我知道它不在范围内,但由于我是 cpp 的新手,我不知道如何使同一个文件可用于两个不同的文件。

如果我在 example1.cc 中声明一个文件,那么它将成为一个新的文件仪式?

我想我终于明白了你想要达到的目标。您希望从两个不同的源文件(翻译单元)访问一个流。我假设由于您是 C++ 的新手,我应该建议最简单的解决方案。请不要假设它是最好的,因为它有很多警告。我们的项目包含三个源文件:foo1.cppfoo2.cppmain.cpp:

文件foo1.cpp

#include <fstream>

extern std::ofstream logger;

void foo1()
{
    logger << "Foo1 started" << std::endl;
    //some stuff
    logger << "Foo1 finished" << std::endl;
}

文件foo2.cpp

#include <fstream>

extern std::ofstream logger;

void foo2()
{
    logger << "Foo2 started" << std::endl;
    //some stuff
    logger << "Foo2 finished" << std::endl;
}

文件main.cpp

#include <fstream>
#include <iostream>

std::ofstream logger;

void foo1();
void foo2();

int main()
{
    logger.open("./data.txt", std::ios::app);

    foo1();
    foo2();

    logger.close();
}

这段代码希望完全编译,执行后会有一个文件data.txt,内容如下: Foo1 开始 Foo1 完成 Foo2 开始 Foo2 完成

我觉得你最感兴趣的应该是main.cpp的第四行和foo1.cppfoo2.cpp的第三行。

main.cpp中的第四行,因为记录器是在main函数之外声明的,这允许其他函数到达记录器并使用它。这不仅适用于此 .cpp 文件中的函数。编译器会将此变量的地址放在 .o 文件的符号 table 中,这正是我的意图。您可以尝试在它之前添加 static 关键字,看看会发生什么。 (它将禁用此行为)

来自 foo1.cppfoo2.cpp 的第三行通知编译器在某些 .o(在我们的例子中是main.o)。编译器将生成使用此类变量的代码,并将放置在该文件需要提供此类变量的符号 table 中(也称为未定义符号)。

如果你设法理解这一点,你也可以使用你自己的头文件。此 "project" 中存在某种重复。 foo1.cppfoo2.cpp的前三行完全一样。您可能需要使用头文件来减少这种情况。

logger.hpp:

#include <fstream>

extern std::ofstream logger;

foo1.cpp:

#include "logger.hpp"

void foo1()
{
...

foo2.cpp

#include "logger.hpp"

void foo2()
{
...

头文件通常仅用于此目的,将与其他源文件的接口保持在一个地方,此外还有内联函数和模板。如果你想把它用在别的地方,请再想一想