我习惯了更高级的语言(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 哈希值的库,但我正在尝试了解哈希值的工作原理,以及最终的哈希冲突)
open()
采用 C 风格字符串。使用 std::string::c_str()
得到这个:
file.open (filename.c_str());
为了仅使用字符串,如下所述,您需要使用支持 C++11 的编译器,因为重载是为 C++11 添加的。
它与 Java 等不同的原因是它来自 C。C 中不存在类(嗯,不像 C++ 中那样好),更不用说
String
类了。为了让 C++ 提供一个字符串类并保持兼容性,它们需要是不同的东西,并且该类提供了 const char * -> std::string
的转换构造函数,以及 c_str()
的转换构造函数。
考虑将参数(也可能是返回值)也传递为
const std::string &
;没有不必要的副本。优化可能会抓住这些,但这样做总是好的。