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

时间:2015-02-08 10:39:34

标签: c++ ios fstream ofstream

我使用ofstream写入文件。

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

现在,我想让这个变量“myfile”被两个不同的文件使用。 例如:example.cc和example1.cc

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

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

我知道它不在范围内,但由于我是cpp的新手,我不知道如何为两个不同的文件提供相同的文件。

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

1 个答案:

答案 0 :(得分:2)

我认为我终于理解了你想要实现的目标。您希望能够从两个不同的源文件(翻译单元)访问一个流。我假设由于您是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.cpp以及foo2.cpp中的第三行。

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

来自foo1.cppfoo2.cpp的第三行通知编译器在某些.o的符号表中会有这样的变量(现在它现在将是它的名称和类型)({在我们的案例中{1}}。编译器将生成使用此类变量的代码,并将在符号表中放置此文件需要提供此类变量(也称为未定义符号)。

如果您设法理解这一点,您也可以使用自己的头文件。这个“项目”中存在某种重复。 main.ofoo1.cpp的前三行完全相同。您可能希望使用头文件来减少这种情况。

logger.hpp:

foo2.cpp

foo1.cpp:

#include <fstream>

extern std::ofstream logger;

foo2.cpp

#include "logger.hpp"

void foo1()
{
...

头文件通常仅用于此目的,以便在一个位置保持与其他源文件的接口,此外还包括内联函数和模板。如果您想将其用于其他事情,请再想一想