ostream(buf)_iterator + бинарный вывод
От: Vano Россия  
Дата: 19.08.03 12:34
Оценка:
Здравствуйте, мастера!

Подскажите, пожалуйста, как можно организовать бинарный вывод в файл массива целых (или с плавающей запятой) чисел?
Мыслится что-то вроде

vector<long> arr;
...
ofstream ofile(FileName,ios::app|ios::binary);
copy(arr.begin(), arr.end(), ostream_iterator<long> (ofile)); //или ostreambuf_iterator...

Но ostream_iterator выводит всегда в текстовом виде, а ostreambuf_iterator не компилируется.

Конечно, обходной вариант с ofile.write(...) работает, но интересно все же сделать через ostream_iterator.
Пишу на VS 7.

Спасибо!
Думай, прежде чем родиться в этой сказочной стране!
(с) Антон Духовской
Re: ostream(buf)_iterator + бинарный вывод
От: Anton V. Kolotaev  
Дата: 19.08.03 12:54
Оценка:
Здравствуйте, Vano, Вы писали:

Может это будет интересно:as_binary
Re: ostream(buf)_iterator + бинарный вывод
От: Анатолий Широков СССР  
Дата: 19.08.03 12:55
Оценка: 2 (1)
Так напиши свой собственный итератор:

template<typename T>
class binary_ostream_iterator
{
public:
    binary_ostream_iterator(std::ostream& ref) : stream(&ref)
    {
    }
       
    binary_ostream_iterator& operator=(const T &value)
    {
        stream->write((const char *)&value, sizeof(T));
        return stream;
    }

    binary_ostream_iterator& operator*()
    {
        return (*this); 
    }

    binary_ostream_iterator& operator++()
    {
        return (*this); 
    }

    binary_ostream_iterator operator++(int)
    {
        return (*this);
    }

private:
   std::ostream* stream;   
};
Re: ostream(buf)_iterator + бинарный вывод
От: MaximE Великобритания  
Дата: 19.08.03 14:26
Оценка:
Здравствуйте, Vano, Вы писали:

V>Здравствуйте, мастера!


V>Подскажите, пожалуйста, как можно организовать бинарный вывод в файл массива целых (или с плавающей запятой) чисел?

V>Мыслится что-то вроде


V>vector<long> arr;
V>...
V>ofstream ofile(FileName,ios::app|ios::binary);
V>copy(arr.begin(), arr.end(), ostream_iterator<long> (ofile)); //или ostreambuf_iterator...


V>Но ostream_iterator выводит всегда в текстовом виде, а ostreambuf_iterator не компилируется.


Попробуй так:
    copy(
        reinterpret_cast<const char*>(&arr.front()),
        reinterpret_cast<const char*>(&arr.back() + 1),
        ostreambuf_iterator<char>(ofile)
    );
Re[2]: ostream(buf)_iterator + бинарный вывод
От: igna Россия  
Дата: 27.01.08 10:02
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Так напиши свой собственный итератор:


Интересно, какие альтернативы написанию своего собственного итератора появились по прошествии четырех с половиной лет?

Пока-что нашел только binary_iostreams.

Вроде это совсем не редко возникающая потребность записать содержимое некого контейнера в файл в двоичном формате. Предполагаю, что большинство никаких итераторов не пишет, а использует цикл for вместо рекомендуемого std::copy. Или нет?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.