2012-06-10 14 views
10

Jestem przyzwyczajony do języków wyższego poziomu (java, python itp.), Gdzie jest to oczywiste. Próbuję przekazać ciąg wejściowy użytkownika do cin, nazwę pliku do otwarcia. Wygląda na to, że istnieje jakiś błąd szaleństwa wskaźnika, a mój kod się nie skompiluje. Usunąłem część kodu, aby było bardziej zrozumiałe.Przekazywanie ciągu do pliku 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; 
    } 

Oto błąd czasu kompilacji.

<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> 

(wiem, że istnieją biblioteki dla hashe MD5, ale próbuję dowiedzieć się, jak działa hash i ostatecznie hash kolizji)

+1

Przed wysłaniem podaj numery linii i dodatkowe odstępy. Utrudnia to kopiowanie i wklejanie kodu do testowania. –

+1

@LokiAstari, Znalazłem go za późno, ale w większości edytorów można zrobić Ctrl + Alt + Wybór, aby wybrać kolumny z liczbami i usunąć je wszystkie naraz. Zaoszczędził mi dużo czasu, odkąd się o tym dowiedziałem. – chris

Odpowiedz

18

open() pobiera ciąg C stylu. Użyj std::string::c_str() uzyskać to:

file.open (filename.c_str()); 

Aby korzystać tylko ciąg, jak wskazano poniżej, trzeba korzystać z kompilatora C++ 11 wsparcie, jak przeciążenie dodano do C++ 11.

Powodem, dla którego nie jest Java itp. Jest to, że pochodzi z C. Klasy nie istnieją w C (no, nie tak dobrze jak w C++), nie mówiąc o klasie String. Aby C++ zapewniało klasę ciągów i zachowywało zgodność, muszą być różne rzeczy, a klasa udostępnia konstruktor konwersji dla const char * -> std::string, a także c_str(), aby przejść w inny sposób.

Rozważ przekazanie argumentu (i być może również zwrotu) jako const std::string &; bez niepotrzebnych kopii. Optymalizacja prawdopodobnie je złapie, ale zawsze dobrze jest robić.

+0

Doskonała, pierwsza część naprawiła mój problem. Ale jaka jest różnica między ciągiem C i ciągiem C++? Ponadto, gdzie powinienem umieścić const std :: string &? Próbowałem deklaracji metody, rzeczywiste wywołanie metody, ale obie dały błędy w czasie kompilacji. – Muricula

+0

@Muricula, ciąg w stylu C to po prostu zwykła tablica znaków. Łańcuch C++ jest rzeczywistą klasą z funkcjami, stanem itp. Postaram się znaleźć tutaj dobre pytanie. – chris

+0

@Muricula, tutaj jest jeden: http://stackoverflow.com/questions/3454900/whats-the-difference-between-c-strings-and-c-strings – chris

Powiązane problemy