2012-06-10 11 views
10

Estoy acostumbrado a idiomas de nivel superior (java, python, etc.), donde esto es obvio. Estoy tratando de pasar una cadena que el usuario ingresa a cin, el nombre de un archivo para abrir. Parece que hay algún tipo de error de locura en el puntero y mi código no se compilará. Eliminé parte de mi código para hacerlo más claro.Al pasar una cadena 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; 
    } 

Aquí está el error de tiempo de compilación.

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

(Sé que hay bibliotecas de hash MD5, pero estoy tratando de aprender acerca de cómo funciona el hash, y la colisión con el tiempo hash)

+1

Tome sus números de línea y espaciado adicional antes de publicar. Hace que sea difícil copiar y pegar el código para la prueba. –

+1

@LokiAstari, lo descubrí demasiado tarde, pero en la mayoría de los editores puedes hacer Ctrl + Alt + Selección para seleccionar las columnas con los números y eliminarlos todos a la vez. Me ahorró mucho tiempo desde que me enteré. – chris

Respuesta

18

open() toma una cadena de estilo C. std::string::c_str() utilizar para conseguir esto:

file.open (filename.c_str()); 

Para utilizar sólo una cadena, como se señala más adelante, tendrá que utilizar un compilador de C++ 11 de apoyo, que se añadió la sobrecarga para C++ 11.

La razón no es como Java, etc., es que se trataba de C. Las clases no existía en C (bueno, no tan bien como lo hacen en C++), y mucho menos una clase String. Para que C++ proporcione una clase de cadena y mantenga la compatibilidad, tienen que ser cosas diferentes, y la clase proporciona un constructor de conversión para const char * -> std::string, así como c_str() para ir en la otra dirección.

Considere pasar el argumento (y tal vez la devolución también) como const std::string & también; sin copias innecesarias La optimización probablemente los atrape, pero siempre es bueno hacerlo.

+0

Excelente, la primera parte solucionó mi problema. Pero, ¿cuál es la diferencia entre una cadena C y una cadena C++? Además, ¿dónde debería poner la const std :: string &? Probé la declaración del método, la llamada al método real, pero ambos dieron errores de compilación. – Muricula

+0

@Muricula, una cadena estilo C es más que una simple serie de caracteres. Una cadena C++ es una clase real con funciones, estado, etc. Trataré de encontrar una buena pregunta aquí. – chris

+0

@Muricula, aquí hay una: http://stackoverflow.com/questions/3454900/whats-the-difference-between-c-strings-andc-c-strings – chris

Cuestiones relacionadas