Tôi đang viết trình phân tích cú pháp C++ cho tệp tùy chọn tùy chỉnh cho một ứng dụng. Tôi có một vòng lặp đọc các dòng dưới dạng option=value
từ một tệp văn bản nơi value
phải được chuyển đổi thành double
. Trong giả nó như sau:Làm thế nào để chuyển đổi std :: string_view để tăng gấp đôi?
while(not EOF)
statement <- read_from_file
useful_statement <- remove whitespaces, comments, etc from statement
equal_position <- find '=' in useful_statement
option_str <- useful_statement[0:equal_position)
value_str <- useful_statement[equal_position:end)
find_option(option_str) <- double(value_str)
Để xử lý tách chuỗi và đi xung quanh để chức năng, tôi sử dụng std::string_view
vì nó tránh sao chép quá mức và nêu rõ mục đích của việc xem các phân đoạn của một std::string
tồn tại trước đó. Tôi đã làm tất cả mọi thứ đến mức mà std::string_view value_str
trỏ đến phần chính xác của useful_statement
có chứa giá trị tôi muốn trích xuất, nhưng tôi không thể tìm ra cách để đọc một số double
từ một số std::string_view
.
Tôi biết về std::stod
không hoạt động với std::string_view
. Nó cho phép tôi viết
double value = std::stod(std::string(value_str));
Tuy nhiên, điều này là xấu xí vì nó chuyển đổi thành một chuỗi mà không thực sự cần thiết, và mặc dù nó sẽ có lẽ không tạo sự khác biệt đáng chú ý trong trường hợp của tôi, nó có thể là quá chậm nếu người ta phải đọc một số lượng lớn các con số từ một tập tin văn bản.
Mặt khác, atof
sẽ không hoạt động vì tôi không thể đảm bảo một trình kết thúc vô hiệu. Tôi có thể hack nó bằng cách thêm \0
vào useful_statement
khi xây dựng nó, nhưng điều đó sẽ làm cho mã gây nhầm lẫn cho người đọc và làm cho nó quá dễ dàng để phá vỡ nếu mã được thay đổi/refactored.
Vì vậy, cách thức sạch sẽ, trực quan và hợp lý để thực hiện việc này là gì?
Bạn có hài lòng với việc sử dụng tăng không? Tôi nghĩ bạn có thể làm điều này với 'boost :: convert (stringview);'. Tôi đã nhận nó ra khỏi đây ... nhận xét cuối cùng trên trang https://github.com/boostorg/convert/issues/29 –
Tìm tốt. Đó có thể là 'boost :: convert (stringview, stringview.length())', mặc dù. Nó chắc chắn là sạch hơn so với chuyển đổi thành một chuỗi và hy vọng nhanh hơn. Nhược điểm duy nhất là phụ thuộc bổ sung để tăng cường. –
patatahooligan
Tắt chủ đề: Rõ ràng đây là psuedocode, nhưng hãy cẩn thận trong cách bạn thực hiện "while (not EOF)". Điều nhỏ nhặt 'while (! Stream.eof())' có một vài gotchas khó chịu. – user4581301