2012-06-10 33 views
10

Tôi đã quen với các ngôn ngữ cấp cao hơn (java, python, vv), nơi điều này đã chết rõ ràng. Tôi đang cố gắng để vượt qua một chuỗi người dùng đầu vào để cin, tên của một tập tin để mở. Dường như có một số loại lỗi con trỏ điên rồ, và mã của tôi sẽ không biên dịch. Tôi đã xóa một số mã của mình để làm rõ hơn.Chuyển chuỗi tới 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; 
    } 

Đây là lỗi thời gian biên dịch.

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

(Tôi biết rằng có những thư viện cho băm md5, nhưng tôi đang cố gắng để tìm hiểu về cách băm hoạt động, và va chạm cuối cùng băm)

+1

Lấy số dòng của bạn và giãn cách thêm trước khi đăng. Nó làm cho nó khó khăn để sao chép và dán mã của bạn để thử nghiệm. –

+1

@LokiAstari, tôi đã tìm thấy nó quá muộn, nhưng trong hầu hết các biên tập viên, bạn có thể thực hiện Ctrl + Alt + Selection để chọn các cột có số và xóa chúng cùng một lúc. Đã dành cho tôi rất nhiều thời gian kể từ khi tôi phát hiện ra nó. – chris

Trả lời

18

open() mất một chuỗi C-phong cách. Sử dụng std::string::c_str() để có được điều này:

file.open (filename.c_str()); 

Để sử dụng chỉ là một chuỗi, như chỉ ra dưới đây, bạn sẽ cần phải sử dụng một trình biên dịch với C++ 11 hỗ trợ, như tình trạng quá tải đã được bổ sung cho C++ 11.

Lý do nó không giống như Java, vv là nó đến từ C. Lớp học không tồn tại trong C (tốt, không gần như cũng như họ làm trong C + +), hãy để một mình một lớp học String. Để cho C++ cung cấp một lớp chuỗi và giữ tính tương thích, chúng cần phải là những thứ khác nhau và lớp này cung cấp một hàm tạo chuyển đổi cho const char * -> std::string, cũng như c_str() để đi theo cách khác.

Cân nhắc chuyển đối số (và cũng có thể trả về) là const std::string &; không có bản sao không cần thiết. Việc tối ưu hóa có lẽ sẽ bắt được, nhưng nó luôn luôn tốt để làm.

+0

Tuyệt vời, phần đầu tiên đã khắc phục được sự cố của tôi. Nhưng differenace giữa một chuỗi C và một chuỗi C++ là gì? Ngoài ra, nơi tôi nên đặt const std :: string &? Tôi đã thử khai báo phương thức, gọi phương thức thực tế, nhưng cả hai đều cho lỗi thời gian biên dịch. – Muricula

+0

@Muricula, Chuỗi kiểu C chỉ là một mảng ký tự đơn giản. Một chuỗi C++ là một lớp thực tế với các hàm, trạng thái, v.v. Tôi sẽ cố gắng tìm một câu hỏi hay ở đây. – chris

+0

@Muricula, đây là một: http://stackoverflow.com/questions/3454900/whats-the-difference-between-c-strings-and-c-strings – chris

Các vấn đề liên quan