2012-06-10 11 views
10

Sono abituato ai linguaggi di livello superiore (java, python ecc.), Dove questo è ovvio. Sto cercando di passare una stringa che l'utente inserisce in cin, il nome di un file da aprire. Sembra che ci sia una sorta di errore di follia del puntatore e il mio codice non verrà compilato. Ho cancellato parte del mio codice per renderlo più chiaro.Passare una stringa a file.open();

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

    string hash(string filename); 

    int main(){ 
      cout << "Please input a file name to hash\n"; 
      string filename; 
      cin >> filename; 
      cout <<hash(filename); 
      return 0; 
    } 


    string hash(string filename){ 
      file.open(filename); 
      if(file.is_open()){ 

        file.close(); 
      } 

      return returnval; 
    } 

Ecco l'errore di compilazione.

<code> 
$ g++ md5.cpp 
md5.cpp: In function ‘std::string hash(std::string)’: 
md5.cpp:22: error: no matching function for call to ‘std::basic_ifstream<char, std::char_traits<char> >::open(std::string&)’ 
/usr/include/c++/4.2.1/fstream:518: note: candidates are: void std::basic_ifstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>] 
</code> 

(lo so che ci sono librerie per hash MD5, ma sto cercando di conoscere come funziona l'hash, e la collisione alla fine hash)

+1

Prendi i numeri di riga e la spaziatura extra prima di postare. Rende difficile copiare e incollare il codice per il test. –

+1

@LokiAstari, l'ho scoperto troppo tardi, ma nella maggior parte degli editor puoi fare Ctrl + Alt + Selection per selezionare le colonne con i numeri in ed eliminarle tutte in una volta. Mi ha salvato un sacco di tempo da quando l'ho scoperto. – chris

risposta

18

open() prende una stringa in stile C. Utilizzare std::string::c_str() per ottenere questo:

file.open (filename.c_str()); 

Per poter utilizzare solo una stringa, come sottolineato di seguito, è necessario utilizzare un compilatore C++ con 11 di supporto, come il sovraccarico è stato aggiunto per C++ 11.

Il motivo non è come Java, ecc è che proveniva da C. Le classi non esisteva in C (beh, non quasi così come fanno in C++), per non parlare di una classe String. Affinché C++ fornisca una classe stringa e mantenga la compatibilità, devono essere diversi e la classe fornisce un costruttore di conversioni per const char * -> std::string e c_str() per passare dall'altra parte.

Considerare di passare l'argomento (e forse anche il ritorno) come const std::string &; nessuna copia inutile. L'ottimizzazione probabilmente li catturerebbe, ma è sempre bene fare.

+0

Eccellente, la prima parte ha risolto il mio problema. Ma qual è la differenza tra una stringa C e una stringa C++? Inoltre, dove dovrei mettere la const std :: string &? Ho provato la dichiarazione del metodo, la chiamata al metodo effettivo, ma entrambi hanno fornito errori in fase di compilazione. – Muricula

+0

@Muricula, una stringa in stile C è più semplicemente un semplice array di caratteri. Una stringa C++ è una classe reale con funzioni, stato, ecc. Proverò a trovare una buona domanda qui. – chris

+0

@Muricula, ecco uno: http://stackoverflow.com/questions/3454900/whats-the-difference-between-c-strings-and-c-strings – chris

Problemi correlati