【问题标题】:Passing a string to file.open();将字符串传递给 file.open();
【发布时间】:2012-06-13 13:14:42
【问题描述】:

我习惯了高级语言(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 散列的库,但我正在尝试了解散列的工作原理,并最终了解散列冲突)

【问题讨论】:

  • 在发布之前把你的行号和额外的间距去掉。这使得复制和粘贴代码进行测试变得困难。
  • @LokiAstari,我发现它为时已晚,但在大多数编辑器中,您可以使用 Ctrl+Alt+Selection 来选择包含数字的列并一次性删除它们。自从我发现它以来,为我节省了很多时间。

标签: c++ string pointers


【解决方案1】:

open() 采用 C 风格的字符串。使用std::string::c_str() 得到这个:

file.open (filename.c_str());

为了只使用字符串,如下所述,您需要使用支持 C++11 的编译器,因为为 C++11 添加了重载。

它不像 Java 等的原因是它来自 C。C 中不存在类(嗯,不如 C++ 中的类),更不用说 String 类了。为了让 C++ 提供一个字符串类并保持兼容性,它们需要是不同的东西,并且该类为const char * -&gt; std::stringc_str() 提供了一个转换构造函数。

考虑将参数(也可能返回)作为const std::string &amp; 传递;没有不必要的副本。优化可能会抓住这些,但这样做总是好的。

【讨论】:

  • 太好了,第一部分解决了我的问题。但是 C 字符串和 C++ 字符串之间的区别是什么?另外,我应该把 const std::string & 放在哪里?我尝试了方法声明,实际的方法调用,但都给出了编译时错误。
  • @Muricula,C 风格的字符串更像是一个普通的字符数组。 C++ 字符串是一个包含函数、状态等的实际类。我会尝试在这里找到一个好问题。
  • @Muricula,这是一个:stackoverflow.com/questions/3454900/…
  • 另一种选择是使用更新的编译器。 C++11 标准为流添加了open(string) 函数。
猜你喜欢
  • 2020-04-08
  • 2016-06-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多