我使用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?
答案 0 :(得分:2)
我认为我终于理解了你想要实现的目标。您希望能够从两个不同的源文件(翻译单元)访问一个流。我假设由于您是C ++的新手,我应该建议最简单的解决方案。请不要认为它是最好的,因为它有很多警告。我们的项目包含三个源文件:foo1.cpp
,foo2.cpp
,main.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.cpp
和foo2.cpp
的第三行通知编译器在某些.o
的符号表中会有这样的变量(现在它现在将是它的名称和类型)({在我们的案例中{1}}。编译器将生成使用此类变量的代码,并将在符号表中放置此文件需要提供此类变量(也称为未定义符号)。
如果您设法理解这一点,您也可以使用自己的头文件。这个“项目”中存在某种重复。 main.o
和foo1.cpp
的前三行完全相同。您可能希望使用头文件来减少这种情况。
logger.hpp:
foo2.cpp
foo1.cpp:
#include <fstream>
extern std::ofstream logger;
foo2.cpp
#include "logger.hpp"
void foo1()
{
...
头文件通常仅用于此目的,以便在一个位置保持与其他源文件的接口,此外还包括内联函数和模板。如果您想将其用于其他事情,请再想一想