LINUX.ORG.RU

C++ & file


0

0

Никак не получается вычитать данные из бинарного файла.

1.
uint32_t vv[4];
ifstream fdi("my_file", ios::binary | ios::in);
fdi.read((char *) vv, 16);
И cout << vv[0]; выдает фигню. (Что должен выдать, я знаю).

2.
vector<uint32_t> vv1(4);
ifstream fdi("my_file", ios::binary | ios::in);
vector<uint32_t>::iterator pV = vv1.begin();
fdi.read((char *) pV, 16);

Вообще ошибка компиляции:

error: invalid cast from type ‘__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std
::allocator<unsigned int> > >’ to type ‘char*’
(g++ 4.2.4)

Хотя тож самое в QT - все ОК.

Для QT
QVector<quint32> vv;
QVector<quint32>::iterator pV = vv.begin();

file.setFileName(my_file);
file.open(QIODevice::ReadOnly);
file.read( (char *) pV, 16 );

И как в "чистых" плюсах правильно и максимально быстро
прочитать бинарные данные ?


В первом должен выдать первые 4 байта как int. А во втором зачем итератор, просто можно fdi.read((char *) &vv1[0], 16);

summatus
()

char vv[16];
ifstream fdi("./test.cxx", ios::binary | ios::in);
fdi.read(vv, 16);
vv[15] = '\0';
cout << vv << endl;

- отлично работает; у тебя с cout проблемы, судя по всему.

Spectr ★★★
()
Ответ на: комментарий от summatus

> А во втором зачем итератор

Может и не зачем ) Но почему ошибка ? И хочу сразу в vector записать, как ?

drZlo
() автор топика
Ответ на: комментарий от Spectr

> у тебя с cout проблемы, судя по всему.

Во мля... Emacs'овский term был открыт - он все и портил, "круто"...

drZlo
() автор топика
Ответ на: комментарий от drZlo

> И хочу сразу в vector записать, как ?

Напиши свой класс, может даже шаблонный, для этого.

Даже если ты получишь адрес первого элемента вектора - лучше этого не делать, т.к. вектор не гарантирует линейного отображения в память. От реализации конечно зависит, но обычно он сразу выделяет N-е (допустим, 1024) количество байт (если не задашь размер вектора в явном виде), и при добавлении 1025-го элемента вектор выделит под свои нужды второй кусок памяти в 1024 байт - эти куски хранятся у него линками на участки памяти.

Т.е. вектор не представляется целостным куском памяти.

Spectr ★★★
()
Ответ на: комментарий от summatus

> Потому что не надо писать в итератор.

Да, но в QT то все нормально...

drZlo
() автор топика

>И как в "чистых" плюсах правильно и максимально быстро прочитать бинарные данные ?

open(), read()

PS: Капча islamid какбе намекает что POSIX не толко православен но и аллахоугоден.

Absurd ★★★
()
Ответ на: комментарий от Spectr

> Даже если ты получишь адрес первого элемента вектора

Так итератор и есть указатель на первый элемент, почему read на него ругается ?

> Напиши свой класс, может даже шаблонный, для этого.

Плюсы пока не очень, может не большой пример без классов, запись данных из файла в вектор. Мне на ум приходит только использование istream_iterator и потом copy в вектор, но проблема, что записать надо не весь файл, а любое кол-во из любого места ? Какова плюсатая идеология по этому поводу (обычный массив, read, seek - эт все понятно, но хоцца в вектор сразу ) ).

drZlo
() автор топика
Ответ на: комментарий от drZlo

>обычный массив, read, seek - эт все понятно, но хоцца в вектор сразу

1) По т.н "Стандарту" C++ элементы в векторе размещаются dctulf строго последовательно единым блоком.

2) Во всех реализациях C++ все элементы в векторе всегда размещаются строго последовательно единым блоком.

2) Одна из официальных функций вектора (по т.н Стандарту) - обеспечивать совместимость с Си-кодом ожидающим массивы в стиле Си в качестве параметров функций.

3) Если вектор сделать непоследовательным, то это сломает 101% реального C++-кода и на это никто не пойдет

На практике это означает что можно совершенно невозбранно создать вектор нужного размера и передать адрес его нулевого элемента в read() или fread():

std::vector<char> a(10); c_func_that_wants_ten_bytes(&a[0]);

Absurd ★★★
()
Ответ на: комментарий от drZlo

>Так итератор и есть указатель на первый элемент, почему read на него ругается ?

Итератор вообще не есть указатель. Так что правильно ругается.

devinull ★★
()
Ответ на: комментарий от Spectr

>Даже если ты получишь адрес первого элемента вектора - лучше этого не делать

23.2.4 Class template vector [lib.vector] 1 A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized) constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency. The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

Не позорься ;)

devinull ★★
()
Ответ на: комментарий от devinull

Точнее вкачестве итератора тожет использоваться и указатель, но обычно это отдельный класс всё-таки.

devinull ★★
()
Ответ на: комментарий от devinull

> Не позорься ;)

отлично, теперь буду в курсе :)

Spectr ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.