Передача строки в файл .open();

Я использую языки более высокого уровня (java, python и т.д.), где это очевидно. Я пытаюсь передать строку, которую пользователь вводит в cin, имя файла для открытия. Кажется, что-то вроде ошибки безумия указателя, и мой код не будет компилироваться. Я удалил часть своего кода, чтобы сделать его более понятным.

   #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;
    } 

Вот ошибка времени компиляции.

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

(Я знаю, что существуют библиотеки для хешей md5, но я пытаюсь узнать о том, как работает хеш, и в конечном итоге хеш-столкновении)

Ответ 1

open() берет строку стиля C. Используйте std::string::c_str(), чтобы получить следующее:

file.open (filename.c_str());

Чтобы использовать только строку, как указано ниже, вам нужно будет использовать компилятор с поддержкой С++ 11, так как перегрузка была добавлена ​​для С++ 11.

Причина, по которой он не похож на Java и т.д., заключается в том, что он пришел из C. Классы не существовали в C (ну, не так же хорошо, как и в С++), не говоря уже о классе String. Чтобы С++ предоставлял класс строк и поддерживал совместимость, они должны быть разными, а класс предоставляет конструктор преобразования для const char * -> std::string, а также c_str() для перехода в другую сторону.

Рассмотрим прохождение аргумента (и, возможно, возвращение тоже) как const std::string &; нет лишних копий. Оптимизация, вероятно, поймает их, но всегда полезно делать.