2017-04-08 60 views
0

我已經用C++編寫了一個代碼,該代碼從文本文件中讀取或使用ifstream/ofstream創建新的代碼。我想添加一個支票.is_open成員函數fstream查看文件是否成功打開。它在主循環內正常工作。然後我試圖創建外循環功能用於此目的,並調用它裏面main,和我有以下錯誤:C++無法檢查函數中的ifstream/ofstream.is_open()

std::ios_base::ios_base(const std::ios_base&) is private.

是否有可能使主環路以外的檢查?怎麼樣?我究竟做錯了什麼?

如果您能提供幫助,我將不勝感激。你可以找到下面的代碼。

P.S.我是C++中的新手,所以如果你看到任何問題,請不要過分批評不專業的編程方法。儘管任何改進建議都值得歡迎。

#include <iostream> 
#include <fstream> 
using namespace std; 

void check_opened(ifstream toget, ofstream togive){ 
    if(toget.is_open()){ 
     cout<<"able to open file(toread.txt)"<<endl; 
    } 
    else { 
     cout<<"failure"<<endl; 
    } 
    if(togive.is_open()){ 
     cout<<"able to create/open a file(newone.txt)"<<endl; 
    } 
    else { 
     cout<<"failure"<<endl; 
    } 
} 
int main() { 
    ifstream toget; 
    ofstream togive; 
    toget.open("toread.txt"); 
    togive.open("newone.txt"); 
    check_opened(toget,togive); 
    toget.close(); 
    togive.close(); 
    return 0; 
} 
+0

無論您是否有'is_open'調用,都會發生錯誤。製作[mcve]的一部分正在挑戰你的假設。 – chris

+1

您正在將'toget'和'togive'值傳遞給'check_opened'函數。它看起來不允許複製'ifstream'和'ofstream's。嘗試將它們作爲引用或指針傳遞。 – gurka

+0

@古爾卡,非常感謝,我用它作爲參考,它的工作。 – UserRR

回答

3

函數check_opened不引用流,它需要一個副本。因此,當你調用check_opened函數時,你的main函數會隱式調用ifstreamofstream的複製構造函數,它們是私有的,這會導致錯誤。將check_opened的簽名更改爲void check_opened(ifstream&, ofstream&)將解決您的問題。

+0

謝謝你的解釋 – UserRR