Основной вопрос здесь. Я читаю файл и записываю значения из файла в 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);
Когда оператор ввода не работает, он устанавливает поток в состояние сбоя, то есть устанавливает флаг состояния 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);
Сделайте это в два этапа:
if (in >> x >> y >> z)
{
mandatory_stuff(x, y, z);
if (in >> w)
{
optional_stuff(w);
}
}
else
{
// malformed input
}