cout << "Enter the number: ";
int number;
if (cin >> number)
{
// throw away the rest of the line
char c;
while (cin.get(c) && c != '\n')
if (!std::isspace(c))
{
std::cerr << "ERROR unexpected character '" << c << "' found\n";
exit(EXIT_FAILURE);
}
cout << "Enter names: ";
string name;
// keep getting lines until EOF (or "bad" e.g. error reading redirected file)...
while (getline(cin, name))
...use name...
}
else
{
std::cerr << "ERROR reading number\n";
exit(EXIT_FAILURE);
}
В приведенном выше коде этот бит ...
char c;
while (cin.get(c) && c != '\n')
if (!std::isspace(c))
{
std::cerr << "ERROR unexpected character '" << c << "' found\n";
exit(EXIT_FAILURE);
}
... проверяет остальную строку ввода после того, как номер содержит только пробелы.
Это довольно многословно, поэтому использование ignore
в потоке после >> x
является часто рекомендуемым альтернативным способом отбрасывания контента до следующей новой строки, но он рискует выбросить не-whitespace и при этом игнорируя поврежденные данные в файле. Вам может или не все равно, в зависимости от того, доверено ли содержимое файла, насколько важно избегать обработки поврежденных данных и т. Д.
Таким образом, std::cin.clear()
(и std::cin.igore()
) для этого не требуется, но полезно для удаления состояния ошибки. Например, если вы хотите дать пользователю много шансов ввести действительный номер.
int x;
while (std::cout << "Enter a number: " &&
!(std::cin >> x))
{
if (std::cin.eof())
{
std::cerr << "ERROR unexpected EOF\n";
exit(EXIT_FAILURE);
}
std::cin.clear(); // clear bad/fail/eof flags
// have to ignore non-numeric character that caused cin >> x to
// fail or there's no chance of it working next time; for "cin" it's
// common to remove the entire suspect line and re-prompt the user for
// input.
std::cin.ignore(std::numeric_limits<std::streamsize>::max());
}
Еще одна простая, но наполовину испеченная альтернатива ignore
для вашего первоначального требования использует std::skipws
, чтобы пропустить любое количество пробелов перед чтением строк ...
if (std::cin >> number >> std::skipws)
{
while (getline(std::cin, name))
...
... но если он вводится как «1E6» (например, какой-то ученый пытается ввести 1 000 000, но C ++ поддерживает эту нотацию для чисел с плавающей запятой ) не согласятся с этим, вы получите number
, установленный на 1
, и E6
считанные как первое значение name
. Отдельно, если у вас есть действительное число, за которым следуют одна или несколько пустых строк, эти строки будут игнорироваться молча.
Хорошо, я нашел решение здесь .
ответ:
Это копирует текущую вкладку, таким образом, Вы доберетесь [Form1.cs:1]
и [Form1.cs:2]
вкладки; и тогда можно использовать вертикальную группу вкладки для просмотра их рядом.
Как бывший разработчик на CodeRush, я сомневаюсь, что это было бы вызвано CodeRush Xpress. Я в настоящее время выполняю последнюю бету CodeRush 9.1.0 на Visual Studio 2008, и разделения хорошо работают. Однако Вы могли, конечно, попытаться удалить CodeRush Xpress, чтобы видеть, разрешает ли это проблему. Если бы это делает, я рекомендовал бы отправить в DevExpress' одноранговые форумы .
сопроводительный текст http://diditwith.net/content_images/CRXSplits.png
Я полагаю, что это не отказ CodeRush. Ванильный 2008 устанавливает, только позволяет Вам сделать представление разделения с одним файлом на вершине и одним файлом в нижней части. Единственное рядом опция является горизонтальной функцией группы вкладки (с проблемой только наличия файла, открытого в одном из них, как Вы упомянули.)
очевидные обходные решения должны были бы или сделать копию только для чтения файла в другом месте и использования, что в одной группе вкладки, или открывают второй экземпляр VS. Это действительно имеет достойную обработку файлов, которые изменяются в других приложениях, таким образом имение того же файла, открытого в двух экземплярах, не является проблемой.
Мне нравится опция вертикальной группы табуляции. Единственное, что меня беспокоит, так это то, что я не могу разместить проводник решений в обоих окнах (или свойствах, если на то пошло). Мне нужно перемещать все на одной стороне и перемещать экраны.