将字符串传递给 file.open();

Passing a string to file.open();

本文关键字:open file 字符串      更新时间:2023-10-16

我已经习惯了更高级的语言(java,python等),这很明显。我正在尝试将用户输入的字符串传递给cin,即要打开的文件的名称。似乎存在某种指针疯狂错误,我的代码将无法编译。我删除了一些代码以使其更清晰。

#include <iostream>
#include <fstream>
using namespace std;
       
string hash(string filename);
    
int main(){
    cout << "Please input a file name to hashn";
    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 &;没有不必要的副本。优化可能会捕获这些,但这总是好的。

相关文章: