Символ CTRL D (шестнадцатеричный 04) сам по себе не является символом конца файла. Нажатие на эту последовательность клавиш сигнализирует драйверу терминала, что это конец входного потока, и любые дальнейшие чтения из этого потока будут обрабатываться так, как будто «файл» завершен. Фактически вы можете изменить символ, используемый для этого, с помощью команды stty
в UNIX.
Что произойдет, когда вы нажмете эту последовательность, так это то, что программа больше не будет вводить никаких данных. Вам нужно найти более разумную последовательность для разграничения ваших данных (как, например, символ новой строки (0x10)).
Но для этого потребуется вводить строки, а не числа с плавающей запятой (вы можете использовать fgets
, чтобы получить строку, и sscanf
, чтобы извлечь число с плавающей запятой после того, как вы проверили на наличие пустой строки).
Другая возможность - использовать -1 в качестве специального значения для часового режима (при условии, что -1 не является допустимым входным сигналом), но следите за сравнениями с плавающей запятой, иногда они не соответствуют ожидаемым.
Я предлагаю пойти по маршруту fgets/sscanf
, но, поскольку вы должны получить n
float, ваш GetValues
должен идти примерно так:
float *GetValues (float *p, size_t n) {
float input;
float *start = p;
cout << "Enter " << n << " float values separated by whitespace: \n";
while (scanf("%f", &input) == 1) {
*p++ = input;
if (--n >= 0)
break;
}
return start;
}
, который перестанет получать значения, как только вы достигнете своего предела. Имейте в виду, что это не идеально. Я оставил там, по крайней мере, одну проблему из-за того, что это домашнее задание (в зависимости от ваших входных данных вы можете его не ударить).
Следует также отметить, что смешивать семантику ввода-вывода C ++ и C (cout
и scanf
) несколько необычно - вам действительно следует выбрать одну или другую. Если это назначение C ++, вы обнаружите, что C ++ имеет более богатый способ ввода / вывода. Если это C, то cout
не имеет места в коде, и вам, вероятно, следует использовать printf
. Я не говорю, что это не будет работать , просто это необычная смесь.