Большинство решений, опубликованных до сих пор, на самом деле не соответствуют спецификации - что все данные до возраста должны рассматриваться как имя. Например, они потерпят неудачу с таким именем, как «Ричард Ван Де Ротстайн».
Как отмечалось в OP, с scanf вы можете сделать что-то вроде: scanf("%[^0-9] %d", name, &age);
, и это будет прекрасно читать. Предполагая, что это линейно-ориентированный ввод, я бы все равно сделал это:
std::string temp;
std::getline(infile, temp);
// technically "[^0-9]" isn't required to work right...
sscanf(temp.c_str(), "%[^0123456789] %d", name, &age);
К сожалению, iostreams не предоставляют прямого аналога преобразования набора сканирования, подобного этому - getline может считывать до разделителя, но вы можете указать только один символ в качестве разделителя. Если вы действительно не можете использовать scanf и company, следующей остановкой будет либо кодирование вручную (начало эры будет temp.find_first_of("0123456789");
), либо использование пакета RE (TR1, если ваш компилятор его предоставит, в противном случае, вероятно, Повышение ).