Я реализую пользовательский лексер на С++, и когда вы пытаетесь прочитать в пробеле, ifstream не будет его читать. Я читаю символ по символу, используя >>
, и все пробелы исчезли. Есть ли способ сделать ifstream держать все пробелы и прочитать его мне? Я знаю, что при чтении целых строк чтение будет останавливаться в пробеле, но я надеялся, что, читая характер по характеру, я бы избегал этого поведения.
Попытка: .get()
, рекомендованная многими ответами, но имеет тот же эффект, что и std::noskipws
, т.е. теперь я получаю все пробелы, но не символ новой строки, который мне нужен для каких-то конструкций.
Здесь код нарушения (расширенные комментарии укорочены)
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;
}
Я ломаюсь на строку while
и просматриваю каждое значение current
по мере его появления, а \r
или \n
определенно не среди них: вход просто переходит к следующей строке в входной файл.