C ++ проблема с istringstream и чтением с плавающей точкой - PullRequest
1 голос
/ 16 февраля 2020

Я пытаюсь читать строки и числа с плавающей точкой из stdin, но у меня возникла странная проблема. При чтении определенных символов ввод «расходуется» и теряется перед чтением в виде строки. Я ожидаю, что любые символы перевернут бит сбоя, а затем очистятся, позволяя символу быть прочитанным как строка.

float fl;
string str;
while (std::getline(std::cin, line))
{
    std::istringstream iss(line);
    while (iss.good())
    {
        if (iss >> fl)
        {
            std::cout << "read: " << fl << "\n";
        }
        else
        {
            iss.clear();
            if (iss >> str)
            {
                std::cout << "read: " << str << "\n";
            }
        }
    }
}

Вот вывод, который я получаю. Вы можете видеть, что некоторые символы, например, не читаются как строки после того, как они не читаются как плавающие.

a
b
c
d
e
f
g
read: g
h
read: h
i
j
read: j
k
read: k
l
read: l
m
read: m
n
o
read: o
p
q
read: q
r
read: r
s
read: s
t
read: t
u
read: u
v
read: v
w
read: w
x
y
read: y
z
read: z
12.0
read: 12
12.33
read: 12.33

Когда я заменяю fl на целое, все работает отлично, проблем с чтением определенных символов не возникает. Я могу читать строки / строки без проблем. Это как-то связано со специальными форматами с плавающей точкой или чтением с плавающей точкой как шестнадцатеричным?

Я на OSX Apple LLVM версии 10.0.1 (clang-1001.0.46.4) Я попытался использовать другой компилятор, и он работы.

...