2012-06-10 6 views
10

私は高級言語(java、pythonなど)に慣れています。私はユーザーが入力した文字列をcinに渡​​そうとしています。これは開くファイルの名前です。ポインタの狂気のエラーのいくつかの並べ替えが表示され、私のコードはコンパイルされません。 私はコードを削除してより明確にしました。文字列をfile.open()に渡します。

#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

転記する前に、行番号と余白を取り除いてください。テスト用にコードをコピー&ペーストするのは難しくなります。 –

+1

@ LokiAstari、私はそれが遅すぎると分かったが、ほとんどのエディタでは、Ctrl + Alt + Selectionを使って数字の列を選択し、それらを一度にすべて削除することができます。私はそれについて知って以来、私に多くの時間を節約しました。 – chris

答えて

18

open() Cスタイルの文字列を取ります。この取得するにはstd::string::c_str()を使用します。単なる文字列を使用するためには

file.open (filename.c_str()); 

を、以下の指摘するように、あなたは、過負荷がCのために追加されたとして、C++ 11のサポートとコンパイラを使用する必要があります++ 11。

Javaのようなものではない理由は、Cから来たということです。クラスはStringクラスではありませんが、Cには存在しませんでした(C++ではほとんどありません)。 C++が文字列クラスを提供して互換性を保つためには、別のものである必要があり、クラスはconst char * -> std::stringの変換コンストラクタを提供し、逆の場合はc_str()に変換コンストラクタを提供します。

const std::string &と同様に引数を渡すことを検討してください。不要なコピーはありません。最適化はおそらくそれらをキャッチしますが、それはいつも良いことです。

+0

優秀、最初の部分は私の問題を解決しました。しかし、Cの文字列とC++の文字列の違いは何ですか?また、const std :: string&をどこに置くべきですか?メソッド宣言、実際のメソッド呼び出しを試しましたが、どちらもコンパイル時にエラーが出ました。 – Muricula

+0

@Muricula、Cスタイルの文字列は単なる文字の単なる配列です。 C++の文字列は関数、状態などを持つ実際のクラスです。私はここで良い質問を見つけようとします。 – chris

+0

@ Murricula、ここが1つです:http://stackoverflow.com/questions/3454900/whats-the-difference-between-c-strings-and-c-strings – chris