2008-11-27 34 views
37

Tôi hiện đang sử dụng std::ofstream như sau:Viết stringstream nội dung vào ofstream

std::ofstream outFile; 
outFile.open(output_file); 

Sau đó, tôi cố gắng để vượt qua một đối tượng std::stringstream-outFile như sau:

GetHolesResults(..., std::ofstream &outFile){ 
    float x = 1234; 
    std::stringstream ss; 
    ss << x << std::endl; 
    outFile << ss; 
} 

Bây giờ outFile tôi chứa gì, nhưng rác: "0012E708" lặp đi lặp lại trên tất cả.

Trong GetHolesResults tôi có thể viết

outFile << "Foo" << std:endl; 

và nó sẽ ra một cách chính xác trong outFile.

Bất kỳ đề xuất nào về những gì tôi đang làm sai?

+1

tôi đề nghị bạn nói lại tiêu đề để một cái gì đó trong dòng: 'writting nội dung stringstream vào ofstream' (hoặc ostream cho những gì quan trọng) –

+1

Eric, bạn nên đánh dấu Johannes' câu trả lời như chấp nhận để tôi có thể xóa của tôi (rõ ràng là tồi tệ hơn cách tiếp cận của mình) –

+1

Ok, xong. Nhưng trở lại trong những ngày, tôi đã sử dụng giải pháp của bạn =) – Eric

Trả lời

67

Bạn có thể thực hiện việc này mà không cần phải tạo chuỗi. Nó làm cho luồng đầu ra đọc ra nội dung của luồng ở bên phải (có thể sử dụng với bất kỳ luồng nào).

outFile << ss.rdbuf(); 
+5

Tôi tò mò: tại sao giải pháp này hoạt động với 'std :: stringstream' nhưng không phải với' std :: ostringstream'? Trong trường hợp thứ hai tôi nhận được một tập tin trống. –

+3

@JaviV vì bạn có thể [chỉ ghi] (http://en.cppreference.com/w/cpp/io/basic_ostream) thành 'std :: oANYSTREAM' và chỉ đọc từ' std :: iANYSTREAM'. Sẽ không có ý nghĩa gì đối với 'output_stream' nếu nó cũng có các hoạt động' read'. Nếu bạn cần cả hai chỉ cần sử dụng 'std :: ANYSTREAM' và bạn đang ở nhà :) –

3

Khi chuyển chuỗi rdbuf vào dòng mới, không được dịch. Văn bản đầu vào có thể chứa \n để tìm thay thế sẽ không hoạt động. Mã cũ đã viết cho một fstream và chuyển nó thành một chuỗi tổn thất các bản dịch endl.

+2

Điều này sẽ là một bình luận không phải là một câu trả lời bởi vì bạn đã không nói làm thế nào để viết một std :: stringstream để một std :: ofstream – bitek

8

Nếu bạn đang sử dụng std::ostringstream và tự hỏi tại sao không có gì được viết bằng ss.rdbuf() thì hãy sử dụng chức năng .str().

outFile << oStream.str(); 
+4

câu trả lời của bạn dẫn tôi đến việc thực hiện sau đây: để có được một mảng 'char' từ' ss', bạn có thể làm 'ss.str(). c_str()'. (chỉ cần đăng bài ở đây vì lợi ích của người mới, những người vấp ngã về điều này trong tương lai.) – dbliss

+1

@Digital_Reality, cảm ơn! không có gì được viết khi tôi sử dụng rdbuff. Lý do cho điều này là gì? – Nasir

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