2015-02-08 94 views
-1

我正在使用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中聲明一個文件比它將成爲一個新的文件儀式?

+0

你還沒有提供足夠的代碼來知道發生了什麼,但我會冒險猜測。嘗試在頂部添加'#include '並將'std ::'放在你使用它之前:'std :: ofstream myfile;' – Galik 2015-02-08 11:18:35

回答

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.cppfoo2.cpp

main.cpp的第四行,因爲記錄器是在main函數之外聲明的,這允許其他函數到達記錄器並使用它。這不僅適用於此.cpp文件中的功能。編譯器會將地址放在符號表中的這個變量的.o文件中,這正是我的意圖。您可以嘗試在其之前添加static關鍵字,並查看會發生什麼情況。 (這將禁用此行爲)從foo1.cppfoo2.cpp

三線通知編譯器會出現這樣的變量(它會立刻它的名稱和類型)中的一些.o(在我們的例子main.o)符號表。編譯器將生成使用此類變量的代碼,並將在符號表中放置此文件需要提供此類變量(即未定義符號)。

如果你設法瞭解這一點,你也可以使用自己的頭文件。這個「項目」中有某種重複。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() 
{ 
... 

文件通常只用於此的頭,保持接口在一個地方的其他源文件,除了在線功能和模板。如果你曾經想過將它用於別的東西,請再考慮一下

+0

非常感謝。它工作......我很高興。感謝這個內容豐富的帖子。 :) – user3913114 2015-02-08 12:23:25

相關問題