2017-04-08 3 views
0

Ich habe einen Code in C++ geschrieben, der aus einer Textdatei liest oder eine neue mit erstellt mit ifstream/ofstream. Ich wollte eine Überprüfung mit .is_open Elementfunktion von fstream hinzufügen, um zu sehen, ob die Dateien erfolgreich geöffnet wurden. Es funktioniert korrekt innerhalb der Hauptschleife. Dann habe ich versucht, zu diesem Zweck eine Funktion außerhalb der Schleife zu erstellen, und nennt es innerhalb main, und ich habe folgende Fehlermeldung:C++ kann ifstream/ofstream.is_open() innerhalb einer Funktion nicht überprüfen

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

Ist es möglich, die Kontrolle außerhalb der Hauptschleife zu machen? Wie? Was mache ich falsch?

Ich würde mich freuen, wenn Sie helfen können. Sie können den folgenden Code finden.

P.S. Ich bin ein Neuling in C++, also überlisten Sie bitte nicht unprofessionelle Programmieransätze, wenn Sie welche sehen. Obwohl irgendwelche Verbesserungsvorschläge mehr als willkommen sind.

#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

Der Fehler tritt unabhängig davon auf, ob Sie den Aufruf 'is_open' haben oder nicht. Ein Teil davon, [mcve] zu machen, stellt deine Annahmen in Frage. – chris

+1

Sie übergeben 'toget' und' togive' nach Wert an die Funktion 'check_opened'. Und es sieht so aus, als ob es nicht erlaubt ist, 'ifstream's' oder' ofstream' zu kopieren. Versuchen Sie, sie als Referenzen oder Zeiger zu übergeben. – gurka

+0

@gurka, Vielen Dank, ich habe es als Referenz verwendet und es hat funktioniert. – UserRR

Antwort

3

Die Funktion check_opened keine Referenz auf einen Strom nehmen, dauert es eine Kopie von einem. Wenn Sie also check_opened aufrufen, ruft Ihre Hauptfunktion implizit den Kopierkonstruktor ifstream und ofstream auf, die privat sind und den Fehler verursachen. Das Ändern der Signatur von check_opened zu void check_opened(ifstream&, ofstream&) wird Ihr Problem lösen.

+0

Danke für die Erklärung – UserRR

Verwandte Themen