2011-12-18 37 views
5

Chức năng open có hạn chế nào đối với loại giá trị chuỗi nào được chuyển vào không?lỗi biên dịch: ifstream :: mở chỉ chấp nhận giá trị chuỗi trong dấu ngoặc kép "" và không phải biến chuỗi

ifstream file; 
string filename = "output.txt"; 
file.open(filename); 

tôi đã cố gắng để vượt qua một chuỗi giá trị với một biến chuỗi, nhưng khi nó cố gắng để biên dịch, kết quả là ...

agent.cpp:2:20: error: ofstream: No such file or directory 
agent.cpp: In function ‘std::string readingline(std::string)’: 
agent.cpp:11: error: aggregate ‘std::ifstream file’ has incomplete type and cannot be  defined 
agent.cpp: In function ‘int main()’: 
agent.cpp:44: error: aggregate ‘std::ofstream writefile’ has incomplete type and cannot be defined 

Mặt khác, khi tôi chỉ cần vượt qua một chuỗi giá trị trong dấu ngoặc kép như "filename.txt", nó biên dịch tốt và chạy tốt.

ifstream file; 
file.open("output.txt"); 

Tại sao lại xảy ra trường hợp này?

Có cách nào để giải quyết vấn đề này không?

+0

bạn có cố chuyển con trỏ tới mảng char không? – neeKo

+2

Xem [Tại sao (i | o) fstream lấy tham số const char * cho tên tệp?] (Http://stackoverflow.com/questions/5972151/why-does-iofstream-take-a-const-char- parameter-for-a-file-name) –

Trả lời

5

Đáng buồn thay, đây là cách hàm tạo và open của std::(i|o)fstream được xác định theo tiêu chuẩn. Sử dụng file.open(filename.c_str()).

Một số thư viện chuẩn cung cấp phần mở rộng cho phép tham số std::string, ví dụ: Visual Studio.

+0

Cảm ơn bạn Xeo. Sử dụng 'file.open (filename.c_str())' đã làm việc. –

+1

Nó không phải là một phần mở rộng nữa, nhưng phù hợp với tiêu chuẩn C++ 11. –

+0

@Bo: Đợi đã, chúng ta có những cái trong C++ 11? Tôi phải bỏ lỡ điều đó. * đi lướt qua tiêu chuẩn * – Xeo

1

Tôi nghĩ rằng các thông báo lỗi của bạn có thể không liên quan đến mã được đề cập, nhưng open có kiểu C const char* và không phải là C++ string. Bạn sẽ cần sử dụng filename.c_str() trong cuộc gọi để gọi điện hoạt động chính xác.

+0

Cảm ơn Mark B đã đề xuất. –

1

Tôi gặp sự cố khi biến mất bằng cách bao gồm fstream và chuyển qua filename.c_str() thay vì chỉ filename.

Thông báo về loại không đầy đủ là vì bạn thiếu tiêu đề (có thể là dù sao, bạn không hiển thị ví dụ đầy đủ).

open lấy một chuỗi kiểu c chứ không phải lớp string.

+0

Cảm ơn bạn tpg2114. –

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