2014-05-12 11 views
15

Sto cercando di conoscere la classe fstream e sto avendo qualche problema. Ho creato un paio di file txt, uno con uno scherzo e l'altro con una battuta finale (joke.txt) e (punchline.txt) solo per il gusto di leggere e visualizzare il contenuto. Chiedo all'utente il nome del file e, se trovato, dovrebbe aprirlo, cancellare i flag e leggere il contenuto. Ma non riesco nemmeno a testare ciò che legge perché attualmente sto ricevendo errori riguardo a una funzione cancellata, ma non lo faccio t sapere cosa significatentativo di fare riferimento a una funzione cancellata

errore 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 

il secondo errore è la stessa esatta, ma per la seconda funzione (displayLastLine())

ed errore 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 

ed ecco il mio codice:

#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

cosa hai fatto per eseguire il debug del tuo problema? Hai provato a scrivere un esempio di lavoro minimo? –

+0

Si chiama una funzione che non è supportata dallo standard. – Theolodis

+0

possibile duplicato di [errore: uso della funzione cancellata] (http://stackoverflow.com/questions/5966698/error-use-of-deleted-function) – Theolodis

risposta

24

ti chiamano una funzione eliminata, essendo il costruttore di copia della classe std::ifstream.

Se si osserva at the reference si nota che il costruttore di copie non è consentito.

così invece di utilizzare:

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

si dovrebbe lavorare con le chiamate per riferimento:

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

Usare un riferimento si comporterà proprio come chiamare il metodo con una copia, ma in realtà si è operando sull'oggetto originale anziché su un nuovo oggetto creato dalla copia. Tienilo a mente per un ulteriore utilizzo della chiamata per riferimento.

Problemi correlati