2011-09-20 22 views
5

Tôi có vô số lớp C++ đọc dữ liệu từ luồng tệp. Các chức năng trông như thế này.C++ chuyển đổi chức năng truyền tệp để sử dụng chuỗi

bool LoadFromFile(class ifstream &file); 

Tôi đang tạo chức năng mới để đọc từ bộ nhớ thay vì tệp. Vì vậy, tôi googled xung quanh và một istringstream dường như làm các trick mà không có bất kỳ sửa đổi mã.

bool LoadFromData(class istringstream &file); 

Bây giờ câu hỏi của tôi là. Tôi cần phải xây dựng dòng này để đọc từ một mảng char. Chuỗi không phải là null-chấm dứt, đó là dữ liệu nhị phân thuần túy và tôi có một số nguyên với kích thước. Tôi đã thử gán nó vào một chuỗi và tạo một luồng từ một chuỗi, tuy nhiên chuỗi kết thúc sau một ký tự null .. và dữ liệu được sao chép.

int size; 
char *data; 
string s = *data; 

Làm cách nào để tạo chuỗi từ con trỏ mảng char mà không sao chép dữ liệu + chỉ định kích thước dữ liệu con trỏ? Bạn có biết bất kỳ giải pháp nào khác ngoài chuỗi không?

+1

Vì vậy, làm rõ: Vấn đề của bạn là 'char *' không bị chấm dứt và do đó bạn gặp sự cố khi tạo chuỗi 'std :: string'? – quasiverse

+0

Yea đó là vấn đề cơ bản. Tôi cũng tự hỏi nếu có ai biết một giải pháp tốt hơn. – Tito

+0

Đây có thể là giải pháp: http://stackoverflow.com/questions/2079912/simpler-way-to-create-ac-memorystream-from-char-size-t-without-copying-th (một phiên bản sử dụng tăng cường, trên bản sao dữ liệu và chỉ hoạt động với gcc) –

Trả lời

4

Viết riêng basic_streambuf lớp học! More details.. (Bằng cách này bạn có thể làm việc trên bộ nhớ hiện tại.)

Để tạo chuỗi từ con trỏ và kích thước: string str(data,data+size); (nó sẽ sao chép dữ liệu).

Mở điều nữa: bạn nên viết lại chức năng của bạn dựa trên istream:

bool LoadFromStream(istream &is); 

Bằng cách này bạn có thể làm các việc sau, bởi vì cả hai istringstreamifstream dựa trên istream (sau này là chức năng này cũng có thể hỗ trợ tcp suối ...):

ifstream file; 
istringstream sstream; 

LoadFromStream(file); 
LoadFromStream(sstream); 
+0

Cảm ơn bạn rất nhiều! Điều này giải quyết vấn đề của tôi mà không thay đổi các chức năng ở tất cả! – Tito

+0

Dường như nó đã làm việc cho các dòng tập tin nhưng khi tôi thông qua một chuỗi chuỗi để nó tôi đã nhận lỗi trình biên dịch này (với mã chính xác ở trên). Tôi đã cố hết sức để nghiên cứu nhưng tôi không hiểu. Nó được biên dịch trong VS. không thể chuyển đổi tham số 1 từ 'lớp std :: basic_istringstream , lớp std :: allocator >' thành 'lớp istream &' – Tito

+0

Tôi sử dụng nó ở nhiều nơi. Bạn nên định nghĩa là 'bool LoadFromStream (istream &is);' đối với 'bool LoadFromStream (lớp istream &is);' Trong tệp tiêu đề tôi thường không sử dụng 'using namespace std;' do đó định nghĩa là: 'bool LoadFromStream (std :: istream &is);'. nên bao gồm ''. – Naszta

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