2016-06-21 13 views
1

Ich weiß nicht, was mit meinem Code falsch ist. Ich versuche, einen Dateipfad von der Konsole für zwei Dateien zu erhalten, dann initialisiere ich einige fstream-Objekte mit diesen Dateien und ios::in | ios::out für eine und eine Addition von ios::binary für die andere.C++: Gelöschte Funktion beim Versuch, fstream als Argument zu übergeben?

Hier sind die wichtigen Teile meines Code:

// Function prototypes 
void INPUT_DATA(fstream); 
void INPUT_TARGETS(fstream); 

int main() 
{ 
    // Ask the user to specify file paths 
    string dataFilePath; 
    string targetsFilePath; 
    cout << "Please enter the file paths for the storage files:" << endl 
     << "Data File: "; 
    getline(cin, dataFilePath); // Uses getline() to allow file paths with spaces 
    cout << "Targets File: "; 
    getline(cin, targetsFilePath); 

    // Open the data file 
    fstream dataFile; 
    dataFile.open(dataFilePath, ios::in | ios::out | ios::binary); 

    // Open the targets file 
    fstream targetsFile; 
    targetsFile.open(targetsFilePath, ios::in | ios::out); 

    // Input division data into a binary file, passing the proper fstream object   
    INPUT_DATA(dataFile); 

    // Input search targets into a text file 
    INPUT_TARGETS(targetsFile); 

    ... 
} 

// Reads division names, quarters, and corresponding sales data, and writes them to a binary file 
void INPUT_DATA(fstream dataFile) 
{ 
    cout << "Enter division name: "; 
    ... 
    dataFile << divisionName << endl; 
    ... 
} 

// Reads division names and quarters to search for, and writes them to a file 
void INPUT_TARGETS(fstream targetsFile) 
{ 
    cout << "\nPlease input the search targets (or \"exit\"):"; 
    ... 
    targetsFile.write(...); 
    ... 
} 

jedoch bei mir Visual Studio schreit auf den INPUT_DATA(dataFile); und INPUT_TARGETS(targetsFile); Teile, nämlich:

function "std::basic_fstream<_Elem, _Traits>::basic_fstream(const std::basic_fstream<_Elem, _Traits>::_Myt &) [with _Elem=char, _Traits=std::char_traits<char>]" (declared at line 1244 of "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\fstream") cannot be referenced -- it is a deleted function 

ich um in der Header-Datei ausgegraben bis ich Linie 1244 fand:

basic_fstream(const _Myt&) = delete; 

Ich habe keine Ahnung wh Das passiert. Ich bin noch ziemlich neu in C++ und habe wahrscheinlich gerade etwas idiotisches gemacht, aber könnte mir bitte jemand helfen?

EDIT: Geklärte Titel

Antwort

3

Sie können keine std::fstream kopieren, so dass der Copykonstruktor gelöscht wird, wie Sie rund um durch das Graben herausgefunden :)

Es gibt auch keinen Grund, eine std::fstream zu kopieren. In Ihrem Fall möchten Sie es als Referenz übergeben, weil Sie das Original std::fstream, das Sie in main erstellt haben, ändern und nicht ein ganz neues erstellen möchten (deshalb wird der Kopierkonstruktor gelöscht, btw :)).

+2

Darüber hinaus können Sie mit den Funktionen »std :: istream &« mehr als nur Dateien bearbeiten. Zum Beispiel, in der Lage, ihre Logik zu testen, indem Sie einen String-Stream übergeben. – chris

2

Das ist, weil die Kopie-Konstruktor std::fstream ‚s gelöscht. Sie können es nicht nach Wert übergeben. Um dies zu lösen, übergeben Sie die std::fstream ‚s Bezug genommen wird, wie folgt:

void INPUT_DATA(fstream& dataFile) { /* ... */ } 
void INPUT_TARGETS(fstream& targetsFile) { /* ... */ } 

Sie haben nichts anderes im Code zu ändern.