13

私は高水準言語 (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ハッシュ用のライブラリがあることは知っていますが、ハッシュがどのように機能するか、そして最終的にハッシュの衝突について学ぼうとしています)

4

1 に答える 1

21

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 &。不要なコピーはありません。最適化はおそらくそれらをキャッチするでしょうが、それは常に良いことです.

于 2012-06-10T04:54:30.213 に答える