Tôi đang triển khai lexer tùy chỉnh trong C++ và khi cố gắng đọc trong khoảng trắng, ifstream sẽ không đọc nó. Tôi đang đọc ký tự theo ký tự bằng cách sử dụng >>
và tất cả khoảng trắng đều biến mất. Có cách nào để làm cho ifstream giữ tất cả các khoảng trắng và đọc nó ra cho tôi? Tôi biết rằng khi đọc toàn bộ chuỗi, đọc sẽ dừng lại ở khoảng trắng, nhưng tôi đã hy vọng rằng bằng cách đọc ký tự theo ký tự, tôi sẽ tránh hành vi này.Đọc từ ifstream sẽ không đọc khoảng trắng
đã thử: .get()
, khuyến cáo của nhiều câu trả lời, nhưng nó có tác dụng tương tự như std::noskipws
, có nghĩa là, tôi nhận được tất cả các không gian bây giờ, nhưng không các kí tự xuống dòng mà tôi cần phải Lex một số cấu trúc.
Dưới đây là mã vi phạm (bình luận mở rộng cắt ngắn)
while(input >> current) {
always_next_struct val = always_next_struct(next);
if (current == L' ' || current == L'\n' || current == L'\t' || current == L'\r') {
continue;
}
if (current == L'/') {
input >> current;
if (current == L'/') {
// explicitly empty while loop
while(input.get(current) && current != L'\n');
continue;
}
Tôi đang phá vỡ trên dòng while
và nhìn vào mỗi giá trị của current
vì nó đến, và \r
hay \n
chắc chắn không nằm trong số họ- đầu vào chỉ bỏ qua dòng tiếp theo trong tệp đầu vào.
Nếu bạn vi phạm dòng thời gian thì chắc chắn bạn sẽ không thấy '\ n' trong' current' như thể 'get' gặp phải' \ n' bạn đang ở trên dòng tiếp tục chứ không phải dòng trong . Hay tôi đã hiểu lầm? –
'L '\ n'' là 16bit' wchar_t', không phải 8bit 'char', nhưng điều đó không có sự khác biệt. –
@Charles: Sau đó, nó sẽ ngừng phá vỡ và không bắt đầu hiển thị nội dung của dòng tiếp theo trên tệp. @ Rene: Đó là một 'wifstream'. – Puppy