C : чтение int из двоичного istream без использования неинициализированной переменной

#c #io #stl #binary #istream

#c #io #stl #двоичный #istream

Вопрос:

Насколько я могу определить, наиболее распространенный способ чтения int из двоичного istream файла заключается в следующем:

 int32_t s;
istr.read(reinterpret_cast<char *>(amp;s), sizeof(int32_t));
  

Но это разделяет объявление и инициализацию переменной, которая обычно не считается идиоматической в C . Легко обернуть вышесказанное во встроенную функцию, которая считывает и возвращает int32_t … но кажется удивительным, что это не было предусмотрено стандартной библиотекой.

Я что-то упускаю? Существует ли стандартная библиотечная функция, которая считывает и возвращает int из istream an?

Комментарии:

1. Здесь есть концепция, которая является препятствием, называемая порядковостью . Некоторые платформы имеют малый порядковый номер, другие — большой порядковый номер. Данные в формате Big Endian, считываемые маленькой конечной платформой, являются неприятной ошибкой. Однако текстовое представление целого числа может быть прочитано независимо от порядкового номера платформы.

2. Кроме того, не все платформы являются 32-разрядными. Существует множество 8-разрядных и 16-разрядных платформ. Итак, я предполагаю, что комитет C не хочет иметь дело с различиями в платформах при реализации двоичного ввода (без перевода) из потока.

3. Вы пробовали написать свою собственную функцию, которая возвращает int32_t из двоичного потока? Что происходит, когда при чтении возникает ошибка или исключение?

4. Кроме того, чтобы уменьшить размер стандартных библиотек, функция, которая может считывать один или более байт, может также использоваться для чтения в 4-байтовом целом числе, а также в 26-байтовой структуре.

5. @ThomasMatthews это справедливые замечания. Я использовал int32_t вместо int по определенной причине, и я знаю о проблеме с порядковым номером. Но обычно, если вы используете C , а не другой язык, это потому, что важна эффективность того или иного вида — и иногда это означает использование двоичного ввода-вывода, а не текста. Что касается конкретно размера библиотеки, я думаю, что это отвлекающий маневр, поскольку неиспользуемый код может быть удален.