2016-11-18 59 views
-1

我有這樣的代碼我可以將一個ostream作爲一個流?

ostream & operator<<(ostream & out, call_class & Org) 
{ 
    for (int i = 0; i<Org.count; i++) 
    { 
     out << Org.call_DB[i].firstname << " " << Org.call_DB[i].lastname 
      << " " << Org.call_DB[i].relays << " " << Org.call_DB[i].cell_number 
      << " " << Org.call_DB[i].call_length << endl; 
    } 

    //Put code to OPEN and CLOSE an ofstream and print to the file "stats7_output.txt". 


    return out; //must have this statement 
} 

,因爲它說我需要使用ofstream打印的out內容到一個文件,我可以只投outofstream和使用?

例如,這會工作嗎?

new_stream = (ofstream) out; 

這是在調用此函數

cout << MyClass << endl; 

MyClass的類型是call_class 的主要功能的代碼假設我不能隨便更改參數out爲類型ofstream

編輯:謝謝你的幫助每個人。我知道這是一個很難回答的問題,因爲缺乏明確的指導。我的教授基本上給了我們同一個問題的兩個不同版本,但他不清楚他在問什麼。我只是將數據寫到函數外部的文件中,希望這會足夠好。

+0

正如評論答案討論,看來你試圖奇怪的事情。在這種情況下,如果您能夠分享作業的精確措辭,那麼最好能讓我們自己理解它。 – Walter

回答

1

您誤會了這個操作員的工作方式。由於該函數採用ostream &,因此它可以與來自ostream(如ofstream)的任何類一起使用。這意味着我們所需要做的就是在ofstream實例上調用此函數,並將輸出定向到實例引用的文件。這看起來像

std::ofstream fout("some text file.txt"); 
call_class Org; 
// populate Org 
fout << Org; 

現在我們將輸出到文件流。輸出功能不關心輸出到哪裏,而是控制來自呼叫站點的輸出。這也爲您提供了相同的操作員適用於所有輸出流的優勢。我們可以用cout替代fout,一些stringstream或從ostream派生的任何其他流。

+0

讓我們假設這是作業,對我來說更重要的是遵循它的優雅或高效的說明。如何打開和關閉一個ofstream(而不是一個ostream)並打印到該函數內的文件? –

+0

你真的需要在'operator <<'中打開一個文件嗎?這是完全意想不到的行爲。 – NathanOliver

+0

只要創建一個'ofstream'實例,你會像在其他任何地方那樣做。 – NathanOliver

1

正如所寫的,使用std::ostream是正確和習慣的。要寫入一個文件,只需創建std::ofstream類型的對象,並用它作爲流對象:

call_class org = /* whatever */ 
std::ofstream str("myfile.txt"); 
str << org; 

這工作,因爲std::ofstreamstd::ostream得來,所以你可以傳遞一個std::ofstream無論到std::ostream一提的是預期。這對多態性至關重要。

此外,如果還是有困惑,同樣的插件可與任何一種std::ostream對象:

call_class org = /* whatever */ 
std::cout << org; 
+0

如何在函數內使用ofstream打印文件?假設我不能更改代碼,我只能添加它。代碼也需要在函數內部實現,而不是在外部。這是作業,所以對我來說更重要的是要遵循它的效率。 (是不是學校精彩?) –

+0

@MattD - 很容易編寫一個函數,將對象的內容複製到文件流中。但是這不會看起來像'operator <<(std :: ostream&,call_class&obj)'。它將會像'write(std :: string file_name,call_class&obj)'一樣。 –

相關問題