2014-05-12 5 views
15

Ich versuche, über die Flstream-Klasse zu lernen, und ich habe einige Probleme. Ich habe ein paar Txt-Dateien erstellt, die eine mit einem Witz und die andere mit einer Pointe (joke.txt) und (punchline.txt), nur um Inhalte einzulesen und anzuzeigen. Ich frage den Benutzer nach dem Dateinamen und wenn er gefunden wird, sollte er es öffnen, die Flags löschen und dann den Inhalt lesen. Aber ich kann nicht mal testen, was es liest, weil ich gerade Fehler bezüglich einer gelöschten Funktion erhalte. t wissen, was das bedeutetversucht, eine gelöschte Funktion zu referenzieren

Fehler 1:

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

der zweite Fehler ist genau das gleiche, aber für die zweite Funktion (displayLastLine())

und Fehler 3:

Error 1 error C2280: 'std::basic_ifstream<char,std::char_traits<char>>::basic_ifstream(const std::basic_ifstream<char,std::char_traits<char>> &)' : attempting to reference a deleted function 

und hier ist mein Code:

#include "stdafx.h" 
#include <string>  
#include <iostream> 
#include <fstream> 

using namespace std; 

void displayAllLines(ifstream joke); 
void displayLastLine(ifstream punchline); 

int main()   
{ 
    string fileName1, fileName2; 
    ifstream jokeFile, punchlineFile; 


    // Desribe the assigned project to the User 
    cout << "This program will print a joke and its punch line.\n\n"; 

    cout << "Enter the name of the joke file (ex. joke.txt): "; 
    cin >> fileName1; 
    jokeFile.open(fileName1.data()); 
    if (!jokeFile) 
    { 
     cout << " The file " << fileName1 << " could not be opened." << endl; 
    } 

    else 
    { 
     cout << "Enter name of punch line file (ex. punchline.txt): "; 
     cin >> fileName2; 
     punchlineFile.open(fileName2.data()); 
     if (!punchlineFile) 
     { 
      cout << " The file " << fileName2 << " could not be opened." << endl; 
      jokeFile.close(); 
     } 

     else 
     { 
      cout << endl << endl; 

      displayAllLines(jokeFile); 

      displayLastLine(punchlineFile); 
      cout << endl; 

      jokeFile.close(); 
      punchlineFile.close(); 
     } 
    } 


    // This prevents the Console Window from closing during debug mode 
    cin.ignore(cin.rdbuf()->in_avail()); 
    cout << "\nPress only the 'Enter' key to exit program: "; 
    cin.get(); 

    return 0; 
} 
void displayAllLines(ifstream joke) 
{ 
    joke.clear(); 
    joke.seekg(0L, ios::beg); 
    string jokeString; 
    getline(joke, jokeString); 
    while (!joke.fail()) 
    { 
     cout << jokeString << endl; 
    } 
} 
void displayLastLine(ifstream punchline) 
{ 
    punchline.clear(); 
    punchline.seekg(0L, ios::end); 
    string punchString; 
    getline(punchline, punchString); 
    while (!punchline.fail()) 
    { 
     cout << punchString << endl; 
    } 
} 
+2

Was haben Sie getan, um Ihr Problem zu debuggen? Hast du versucht, ein minimales Arbeitsbeispiel zu schreiben? –

+0

Sie rufen eine Funktion auf, die vom Standard nicht unterstützt wird. – Theolodis

+0

mögliches Duplikat von [Fehler: Verwendung der gelöschten Funktion] (http://stackoverflow.com/questions/5966698/error-use-of-deleted-function) – Theolodis

Antwort

24

Sie eine gelöschte Funktion aufrufen, std::ifstream die Kopie Konstruktor der Klasse zu sein.

Wenn Sie einen Blick auf at the reference werfen, bemerken Sie, dass der Kopierkonstruktor nicht erlaubt ist.

so statt mit:

void displayAllLines(ifstream joke); 
void displayLastLine(ifstream punchline); 

Sie mit Anrufen von Referenz funktionieren sollen:

void displayAllLines(ifstream& joke); 
void displayLastLine(ifstream& punchline); 

Mit Hilfe eine Referenz nur mit einer Kopie wie der Aufruf die Methode verhalten, aber in Wirklichkeit sind Sie Verwenden des ursprünglichen Objekts anstelle eines neuen Objekts, das aus einer Kopie besteht. Beachten Sie dies für die weitere Verwendung des Anrufs als Referenz.

Verwandte Themen