Передача строки в файл .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 &
; нет лишних копий. Оптимизация, вероятно, поймает их, но всегда полезно делать.