2012-06-10 183 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++ 11的支持,爲下添加過載++ 11。

它不像Java等的原因是它來自C類(在C中不存在),更不用說類C++了。更不用說String類。爲了讓C++提供一個字符串類並保持兼容性,它們需要不同的東西,並且該類提供了一個用於const char * -> std::string的轉換構造函數,以及c_str()用於其他方式。

考慮通過參數(也可能是回報)const std::string &以及;沒有多餘的副本。優化可能會趕上那些,但總是很好做。

+0

非常好,第一部分解決了我的問題。但是C字符串和C++字符串之間有什麼區別?另外,我應該在哪裏把const std :: string&?我嘗試了方法聲明,實際的方法調用,但都給編譯時錯誤。 – Muricula

+0

@Muricula,C風格的字符串更多的只是一個普通的字符數組。 C++字符串是一個包含函數,狀態等的實際類。我將嘗試在這裏找到一個好問題。 – chris

+0

@Muricula,這裏是一個:http://stackoverflow.com/questions/3454900/whats-the-difference-between-c-strings-and-c-strings – chris