如何使用 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.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
文件的符号 table 中,这正是我的意图。您可以尝试在它之前添加 static
关键字,看看会发生什么。 (它将禁用此行为)
来自 foo1.cpp
和 foo2.cpp
的第三行通知编译器在某些 .o
(在我们的例子中是main.o
)。编译器将生成使用此类变量的代码,并将放置在该文件需要提供此类变量的符号 table 中(也称为未定义符号)。
如果你设法理解这一点,你也可以使用你自己的头文件。此 "project" 中存在某种重复。 foo1.cpp
和foo2.cpp
的前三行完全一样。您可能需要使用头文件来减少这种情况。
logger.hpp:
#include <fstream>
extern std::ofstream logger;
foo1.cpp:
#include "logger.hpp"
void foo1()
{
...
foo2.cpp
#include "logger.hpp"
void foo2()
{
...
头文件通常仅用于此目的,将与其他源文件的接口保持在一个地方,此外还有内联函数和模板。如果你想把它用在别的地方,请再想一想
我正在使用 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.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
文件的符号 table 中,这正是我的意图。您可以尝试在它之前添加 static
关键字,看看会发生什么。 (它将禁用此行为)
来自 foo1.cpp
和 foo2.cpp
的第三行通知编译器在某些 .o
(在我们的例子中是main.o
)。编译器将生成使用此类变量的代码,并将放置在该文件需要提供此类变量的符号 table 中(也称为未定义符号)。
如果你设法理解这一点,你也可以使用你自己的头文件。此 "project" 中存在某种重复。 foo1.cpp
和foo2.cpp
的前三行完全一样。您可能需要使用头文件来减少这种情况。
logger.hpp:
#include <fstream>
extern std::ofstream logger;
foo1.cpp:
#include "logger.hpp"
void foo1()
{
...
foo2.cpp
#include "logger.hpp"
void foo2()
{
...
头文件通常仅用于此目的,将与其他源文件的接口保持在一个地方,此外还有内联函数和模板。如果你想把它用在别的地方,请再想一想