Эффективная потоковая передача двоичных файлов

#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> ‘s read для чтения в буфер, который может быть указателем на предварительно выделенный std::vector. Таким образом, вы не будете перемещать данные.

2. @eudoxos Так же, как istream::read может.

Ответ №1:

Написанный код должен считывать массив из 16 битных значений. Единственная проблема заключается в том, что предполагается, что порядок байтов, с которым был записан файл, совпадает с порядком байтов, используемым при его чтении. Так ли это, не ясно из вопроса. В случаях, когда происходит обмен файлами, например, между компьютерами x86 и Sparc, обычно выбирается сетевой порядок байтов и обрабатываются значения с помощью ntohs() при чтении (и htons() при записи). Хотя они выглядят как функции, обычно это просто макросы, которые ничего не изменяют к значению на платформах, использующих сетевой порядок байтов.

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

1. Или используйте одну из _swab функций стиля, которая работает сразу с целым блоком значений. В любом случае, используйте блочное чтение для ввода-вывода и выполните обмен байтами впоследствии, не считывайте отдельные элементы и не обменивайте байты.