2014-09-09 3 views
-1

Я пытаюсь прочитать в файле, что должен содержать только цифры в нем. Я могу успешно прочитать во всем файле, если он отвечает этим критериям, но если в нем так получилось письмо, мне нужно вернуть false с помощью оператора ошибки.C++ Чтение в файле только с номерами (удваивается)

Проблема заключается в том, что мне сложно найти ошибку, когда она находит этот символ. Он не может найти его без проблем, но когда он это делает, он решает просто пропустить его.

Мой код для чтения в файл и попытаться прочитать только цифры:

bool compute::Read (ifstream& stream) 
{ 
    double value; 
    string line; 
    int lineNumber = 1; 

    if (stream) 
    { 
     while (getline(stream, line)) 
     { 
      lineNumber++; 
      istringstream strStream(line); 

      while (strStream >> value) 
      { 
       cout << value << endl; 
      } 

     } 

    } 

    return true; 
} 

Входной файл, который я использую для этого

70.5 61.2 A8 10.2 
2 

Обратите внимание, что существует не номер в моем входном файле. Он должен потерпеть неудачу и вернуть false в этот момент.

В настоящее время все, что он делает, это когда оно попадает в «A», оно просто возвращается к следующей строке, продолжая цикл getline while.

Любая помощь с этим была бы высоко оценена.

+0

Давайте будем ясны. Файл не содержит 'doubleles', или если вы его читаете в двоичном формате. Он содержит * действительные числа * в текстовом формате, которые вам нужно * конвертировать * в 'double.' – EJP

+0

В вашем коде не содержится никаких инструкций по остановке и возврату false ... –

+0

@EJP Он содержит двойные символы, они представлены как текст. – CashCow

ответ

1

stringstream делает улавливает эти ошибки, но вы ничего не делаете, чтобы остановить замкнутый цикл от продолжения при обнаружении ошибки. Вам нужно настроить свой основной цикл так, чтобы он останавливался, когда stringstream обнаруживает ошибку, которую вы не можете сделать, если строковый поток реконструируется на каждой итерации. Вы должны создать цикл for() и построить строковый поток в части декларации. И условие для цикла должно быть «до тех пор, пока строка string и stream не поймают ошибку». Например:

for (std::istringstream iss; iss && std::getline(stream, line);) 
{ 
    iss.clear(); 
    iss.str(line); 

    while (iss >> value) 
    { 
     std::cout << value << '\n'; 
    } 
} 

Futhermore, это не выглядит, как вам нужно использовать std::getline() или std::istringstream, если вы просто хотите, чтобы напечатать каждое значение. Вобще:

while (stream >> value) { 
    std::cout << value << '\n'; 
} 

выше остановится, когда он находит недопустимый символ для double.

+0

Спасибо за ваш ответ. Кажется, что цикл while в первой половине вашего комментария никогда не входит. Я пытался использовать это и давал ему файл только с номерами, и он просто не входил в него. Любая идея, почему это может быть? Я проверил, и он все-таки входит в цикл for. – Sej

+0

@Sej Если он все еще не работает, переместите 'iss.clear()' над строкой 'iss.str()'. – 0x499602D2

0

Вам нужен код, чтобы остановить потоковое воспроизведение, но вернуть false, если он еще не достиг конца «ввода».

Один из способов, возможно, не самый эффективный, но еще один способ, чтобы сделать это, разобрать слово за раз.

Если вы читали первую в std::string и, если он работает (так что строка не пуста) создать istringstream из этой строки, или использовать существующий, и попытаться потоковой, что в значение double.

Если это не удается, у вас есть недопустимый символ.

Конечно, вы можете прочитать строку за раз из файла, а затем разделить это на слова, чтобы вы могли вывести осмысленное сообщение об ошибке, показывающее, в какой строке был найден неправильный текст.

Вопрос о чтении прямо в двойники заключается в том, что поток будет терпеть неудачу, когда он достигнет конца файла.

Однако это можно обойти обходным путем, потому что причина сбоя имеет состояние ошибки, которое вы можете проверить, то есть вы можете проверить, установлено ли оно eofbit. Хотя f в eofbit означает «файл», он применяется к любому потоку, а не только к файлам.

Хотя этот метод может звучать лучше, чем чтение слов в строку сначала, я предпочитаю этот метод в обычных обстоятельствах, потому что вы хотите сообщить об ошибке, чтобы вы захотели напечатать в ошибке то, что было прочитано.

Смежные вопросы