#c
#c
Вопрос:
Я ищу возможность потоковой передачи блоков из 16-разрядных целых чисел в программу. (Может быть из файла или стандартного ввода, что угодно.) Будучи максимально кратким, моя отправная точка подсчитывает октеты, введенные в программу:
#include <cassert>
#include <cstdint>
#include <iostream>
int main() {
int16_t samples[768];
while (std::cin.good()) {
std::cin.read(reinterpret_cast<char *>(samples), sizeof(samples));
if (std::cin.gcount() == sizeof(samples)) {
// ...
}
}
assert(std::cin.eof());
return 0;
}
Пока это работает, я хочу убедиться, что я не пропустил еще какой-нибудь метод C для выполнения той же функции. (Создать std::vector и читать непосредственно в его область памяти?) Предполагается, что это должно быть эффективным, поэтому я предполагаю, что о чтении одного 16-разрядного целого числа за раз и добавлении к вектору не может быть и речи.
Какие мысли?
Комментарии:
1. Я бы использовал
<unistd.h>
‘sread
для чтения в буфер, который может быть указателем на предварительно выделенный std::vector. Таким образом, вы не будете перемещать данные.2. @eudoxos Так же, как
istream::read
может.
Ответ №1:
Написанный код должен считывать массив из 16 битных значений. Единственная проблема заключается в том, что предполагается, что порядок байтов, с которым был записан файл, совпадает с порядком байтов, используемым при его чтении. Так ли это, не ясно из вопроса. В случаях, когда происходит обмен файлами, например, между компьютерами x86 и Sparc, обычно выбирается сетевой порядок байтов и обрабатываются значения с помощью ntohs()
при чтении (и htons()
при записи). Хотя они выглядят как функции, обычно это просто макросы, которые ничего не изменяют к значению на платформах, использующих сетевой порядок байтов.
Комментарии:
1. Или используйте одну из
_swab
функций стиля, которая работает сразу с целым блоком значений. В любом случае, используйте блочное чтение для ввода-вывода и выполните обмен байтами впоследствии, не считывайте отдельные элементы и не обменивайте байты.