Проверка правильности ввода C ++

0

Основной вопрос здесь. Я читаю файл и записываю значения из файла в unsigned ints, например:

// The essential stuff
std::ifstream infile(filePath.c_str());

std::getline(infile, line);
std::istringstream in(line);

char type;
in >> type;

unsigned int x, y, z, w;
in >> x >> y >> z >> w;  // My question relates to this here.

Здесь проблема: получение значений x, y, z и w отлично работает, за исключением того, что я хотел бы, чтобы w был необязательным. Таким образом, строка может содержать f 0 1 2 3 (тип, плюс 4 значения), или она может содержать только f 0 1 2.

Наивно, я надеялся, что w будет просто равно EOF или что-то подобное, но, увы, такого не происходит.

Я мог подсчитать пробелы в строке и использовать это, чтобы проверить, существует ли w или нет. Или я мог бы использовать peek чтобы проверить, закончилась ли строка после z или нет, но это не совсем так просто, поскольку я также хотел бы игнорировать пробелы (т.е. Может существовать 10 пробелов между символами z и w, все равно должны быть действительными). Поэтому решения определенно существуют, но мне интересно, есть ли какой-нибудь более аккуратный способ? Что-то вроде этого, может быть?

writeTo(w);
if w is junk
    disposeOf(w);
Теги:
string
file
validation

2 ответа

2
Лучший ответ

Когда оператор ввода не работает, он устанавливает поток в состояние сбоя, то есть устанавливает флаг состояния std::ios_base::failbit в потоке. Когда этот флаг установлен, поток преобразуется в значение false, т.е. Вы можете использовать поток, чтобы узнать, был ли вход успешным:

if (in >> x >> y >> z) {
    if (in >> w) {
        deal_with_all_for_values(x, y, z, w);
    }
    else {
        deal_with_only_the_first_tree(x, y, z);
    }
}

Большинство значений задаются только тогда, когда операция чтения успешна, т.е. Если у вас есть специальное значение, которое вы хотите дать w вы можете просто прочитать значение, а если оно отсутствует, оно сохранит свое первоначальное значение:

int w = 17;
if (in >> x >> y >> z) {
    in >> w;
    deal_with_the_values(x, y, z, w);
  • 0
    Я попытался вывести значение w на консоль, что дало бы мне какое-то случайное значение, но на самом деле я не устанавливал его значение на что-либо, прежде чем пытаться записать в него, что объясняет искаженные результаты! Информативный ответ, спасибо за это.
3

Сделайте это в два этапа:

if (in >> x >> y >> z)
{
     mandatory_stuff(x, y, z);
     if (in >> w)
     {
         optional_stuff(w);
     }
}
else
{
     // malformed input
}
  • 0
    Отлично! Я не понял >> ничего не вернул. Как примечание, я понятия не имею, как называется оператор >>, что делает его сложным для Google ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню