Làm cách nào để đọc một tệp thành một std::string
, tức là đọc toàn bộ tệp cùng một lúc?
Văn bản hoặc chế độ nhị phân nên được chỉ định bởi người gọi. Các giải pháp nên được tuân thủ tiêu chuẩn, di động và hiệu quả. Nó không cần sao chép dữ liệu của chuỗi và nó sẽ tránh sự phân bổ lại bộ nhớ trong khi đọc chuỗi.
Một cách để làm điều này là thống kê kích thước tệp, thay đổi kích thước std::string
và fread()
vào std::string
's const_cast<char*>()
' ed data()
. Điều này đòi hỏi std::string
dữ liệu phải liền kề mà tiêu chuẩn không yêu cầu, nhưng dường như đó là trường hợp của tất cả các triển khai đã biết. Điều tồi tệ hơn là, nếu tệp được đọc ở chế độ văn bản, std::string
kích thước của tệp có thể không bằng kích thước của tệp.
Một hoàn toàn đúng, giải pháp tiêu chuẩn tuân thủ và di động có thể được xây dựng bằng std::ifstream
's rdbuf()
thành một std::ostringstream
và từ đó thành một std::string
. Tuy nhiên, điều này có thể sao chép dữ liệu chuỗi và / hoặc bộ nhớ phân bổ lại không cần thiết.
- Có phải tất cả các triển khai thư viện tiêu chuẩn có liên quan đủ thông minh để tránh tất cả các chi phí không cần thiết?
- Có cách nào khác để làm điều đó?
- Tôi có bỏ lỡ một số chức năng Boost ẩn đã cung cấp chức năng mong muốn không?
void slurp(std::string& data, bool is_binary)
rdbuf
(câu trả lời được chấp nhận) không phải là nhanh nhất read
.