воскресенье, 23 мая 2010 г.

Считать число. Продолжение темы.

Ранее я уже писал, как проще всего считать число из стандартного ввода и строки. Теперь возникла необходимость считать некую белиберду из строки, в которой может быть неск. элементов, пробелы и всякий мусор. Но главное, если там не чисто целое число, а, например, 4.aa, то чтобы не была считана 4, отбросив остальное. И можно было бы определить, что тут косяк.

Сделал функцию, которой передаём поток (как при чтении числа из строки),
из которого читаем:

string getElement(istringstream* strStream) {
    char ch;
    string* input = new string;
    input->assign("");
    // Пропуск пробелов
    do {
        strStream->read(&ch, 1);
    } while (ch == ' ');
        // Считывание минуса, если он есть
        if (ch == '-') {
            input->append(1, ch);
            strStream->read(&ch, 1);
        }
        // Поэлементное считывание числа
        do {
            if ((ch >= '0') && (ch <= '9')) {
                if (strStream->good()) {
                    input->append(1, ch);
                    strStream->read(&ch, 1);
                } else
                    break;
            } else if (!strStream->good() || (ch == ' ') || (ch == '\n') || (ch == '\0'))
                break;
            else {
                return "error";
            }
        } while (1);
    return *input;
}
А потом полученную строку пытаемся загнать в переменную.
Отрывок из кода, где такая штука используется:

testString->assign("");
getline(inputfile, *testString);
testStream = new istringstream(*testString);
element = new istringstream(getElement(testStream));
delete testStream;

if ((*element >> s) && (s > 0) && (s <= 127)) {
          outputfile << s << endl;
          delete element;
}

Комментариев нет: