Почему они работают так:
Хорошо, операторы потока >> и << предназначены для чтения текста (или читаемых человеком потоков (или файлов)). Таким образом, при использовании вы ожидаете определенный тип ввода, который имеет определенную форму: </p>
int a;
stream >> a; // I expect the stream to contain an integer in human readable form.
MyClass x;
stream >> x; // I expect the class to contain a serialize version of x;
Если бы символ был автоматически преобразован в целое число, поток не работал бы так, как большинство людей ожидает, что операторы потока будут работать (то есть читают читаемые человеком формы). то есть вы знаете, что ASCII-значение 'z' должно быть? Знаете ли вы, если ваша платформа представляет символы в виде ASCII? и т. д. Есть много вопросов, о которых известно только наполовину, если мы выбрали этот путь.
Теперь, если вы хотите обработать ваш файл как двоичное значение. Вы можете прочитать один байт и считать его целым числом.
char y;
stream.read(&y, 1); // Read a single byte into y
int x = y; // now convert the byte to an integer.
Переход к исключениям:
Исключения хороши, когда вы обрабатываете ошибки отдельно от обработки. Это нормально, когда у вас огромные файлы, а ошибка при вводе файла обычно означает повреждение, и вам следует прекратить обработку. Тогда исключения являются идеальным решением.
Но простые примеры, хотя вы обычно обрабатываете пользовательский ввод. Обнаружение и исправление пользовательского ввода обычно выполняется на месте обработки, поэтому исключения не являются лучшим решением проблемы.
std::cout << "Enter a number\n";
int number;
while(!(std::cin >> number))
{
std::cout << "That was not a number\n";
std::cin.clear();
std::cin.ignore();
}
// With exceptions:
// That's too much work.
Но если я обрабатываю индекс Google:
// If the read fails get out of here with an exception.
while(data >> x >> y >> z >> j >> q >> p >> src >> dst)
{
doWork();
}
ExapndAndGrok();
// Handling the errors:
while(data >> x >> y >> z >> j >> q >> p >> src >> dst)
{
doWork();
}
if (testDataStreamForSomeError(data)) // EOF is not an error.
{
throw someException("The input failed");
}
ExapndAndGrok();