crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Загрузить в массив из бинарного файла
Гость_One_*
сообщение 17.1.2011, 21:17
Сообщение #1





Гости








    


Заранее извините за глупый вопрос. У меня есть бинарный файл, в него последовательно записаны координаты точек (x, y) типа float. Теперь требуется извлечь данные в массив, но не как если бы я сразу извлекал всё в вектор, а по кускам, потому что их нужно еще преобразовать. Вот код
QFile file("data.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);

float x, y;
// nmax - количество точек
for (int i=0; i<nmax; i++)
{
   in >> x >> y;
   // преобразования
   // запись в массив
}


Проблема в том, что когда считываю "y" позиция в потоке не смещается, и следующее считывание "x" происходит из места, где хранилось предыдущее "y". Поэтому массив считывается перепутано. Помогите исправить, пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 17.1.2011, 22:07
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Видимо ошибка где то в другом месте. В том коде, что вы привели всё правильно.
Вот простейший тест
    QByteArray byteArray;
    QBuffer buffer(&byteArray);
    buffer.open(QIODevice::ReadWrite);

    QDataStream out(&buffer);
    out << 1.1 << 2.2 << 3.3 << 4.4 << 5.5 << 6.6 << 7.7 << 8.8;

    buffer.seek(0);

    float x, y;
    for(int i=0;i!=4;++i) {
        out >> x >> y;
        qDebug() << "x =" << x << "y =" << y;
    }
Вывод
Цитата
x = 1.1 y = 2.2
x = 3.3 y = 4.4
x = 5.5 y = 6.6
x = 7.7 y = 8.8
Т.е. работает так как ожидается.

P.S. то что я заменил файл на буфер значения для теста не имеет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_One_*
сообщение 18.1.2011, 1:08
Сообщение #3





Гости








    


Вы правы, дело не в этом. Вот такая странность творится. Дело в том, что массив, который хранится в файле, я записал через контейнер-вектор. Просто вставил вектор в поток. Когда я его считываю через вектор, опять же вектор вставляю в поток и все нормально считывается, все значения правильны. Когда же я считываю через цикл, то обнаруживаю, что в самом начале файла записался лишний элемент размером 4 байта, вот он и приводит к смещению всех значений. Но откуда взялся этот лишний элемент, не понимаю. Может это контейнер-вектор обозначил так свое начало? :blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.1.2011, 1:22
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


а покажи значение этих байтов
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 18.1.2011, 9:48
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(One @ 18.1.2011, 1:08) *
Может это контейнер-вектор обозначил так свое начало? :blink:

В документации все написано. Это контейнер сохраняет общее количество элементов, которое он содержит.

Сообщение отредактировал BRE - 18.1.2011, 9:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 18.1.2011, 9:53
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Гость_One_* @ 18.1.2011, 1:08) *
Вы правы, дело не в этом. Вот такая странность творится. Дело в том, что массив, который хранится в файле, я записал через контейнер-вектор. Просто вставил вектор в поток.

покажи этот код.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 18.1.2011, 11:04
Сообщение #7





Гости








    


По такому принципу:
QVector<float> data;
//...
out << data;
//...
in >> data;


Первое число типа float порядка 1e-44, вроде бы так было.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_One_*
сообщение 18.1.2011, 11:12
Сообщение #8





Гости








    


Если более точно, то 6,16571e-44 типа float (4 байта), странно да? А может это на самом деле 4 байта типа int, которые неправильно "распознались".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 18.1.2011, 11:16
Сообщение #9


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Вам же уже ответили на ваш вопрос
Цитата(BRE @ 18.1.2011, 9:48) *
Цитата(One @ 18.1.2011, 1:08) *
Может это контейнер-вектор обозначил так свое начало? :blink:

В документации все написано. Это контейнер сохраняет общее количество элементов, которое он содержит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 3:15