От пыхи не убежишь

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 25 Май, 2012, 07:53:43

Страниц: [1]
Печать
Автор Тема: vector of structs в файл...  (Прочитано 268 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlexanderC    ↓ 
14 Декабрь, 2011, 02:42:55
НЕ ХУЕТА! ХУЕТА!


Карма: 1
Сообщений: 140
Сила слова: 0.71

Есть stl::vector из структур
C#

#ifndef vStr
   typedef vector<string> vStr;
#endif
 
#ifndef Discipline
  typedef struct Discipline
  {
      vStr department;
      string name;
      string faculty;
      unsigned int hq;
  } Dis;
#endif
 
#ifndef vDis
   typedef vector<Dis> vDis;
#endif
 

где  vDis vD это вектор структур.
 
Есть проблемка. При записи в файл:
C#

// FILE *db;
fwrite(&vD.begin(), sizeof(Dis), vD.size(), db);
 
всё ок, но вот при чтении:
C#

// FILE *db;
fseek(db, 0, SEEK_END);
long lSize = ftell(db);
rewind(db);
 
fread(&vD.begin(), sizeof(Dis), lSize/sizeof(Dis), db);
 
Выдаёт ошибку: Access violation reading location...
 
Как я понимаю это при попытке чтения адреса памяти.
 
Вопрос: как же мне записать эту котлету в файл???
 
Мэни сенкс...
« Последнее редактирование: 14 Декабрь, 2011, 02:42:55 от Frozzeg » Записан

*Не всё  Windows™ что виснет, не всё  Linux что "да ну его..."
Frozzeg    ↓ 
14 Декабрь, 2011, 02:45:28 , спустя 2 минуты 33 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5501
Сила слова: 1.67

http://msdn.microsoft.com/en-us/library/ms233843.aspx
Записан
AlexanderC    ↓ 
14 Декабрь, 2011, 02:49:50 , спустя 4 минуты 22 секунды
НЕ ХУЕТА! ХУЕТА!


Карма: 1
Сообщений: 140
Сила слова: 0.71

// Serialization (C# and Visual Basic)
C++?  
Спустя 19 секунд добавил
ну или vc++?
Спустя 2 минуты 36 секунд добавил
интересно, кроме boost-а можно отдельно найти имплементацию сериализации...?
Записан

*Не всё  Windows™ что виснет, не всё  Linux что "да ну его..."
Frozzeg    ↓ 
14 Декабрь, 2011, 02:52:52 , спустя 3 минуты 2 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5501
Сила слова: 1.67

ну или vc++?
одна херня — .NET
 
мсдн в помощь
Записан
AlexanderC    ↓ 
14 Декабрь, 2011, 02:56:32 , спустя 3 минуты 40 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 1
Сообщений: 140
Сила слова: 0.71

сенкс, курим пока... но тему можно НЕ закрывать...
Записан

*Не всё  Windows™ что виснет, не всё  Linux что "да ну его..."
AlexanderC    ↓ 
14 Декабрь, 2011, 05:41:46 , спустя 2 часа 45 минут 14 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 1
Сообщений: 140
Сила слова: 0.71

мдеа, и всё-таки буст....
Спс, тему можно закрывать
Записан

*Не всё  Windows™ что виснет, не всё  Linux что "да ну его..."
Nyaah    ↓ 
14 Декабрь, 2011, 10:20:38 , спустя 4 часа 38 минут 52 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 34
Сообщений: 522
Сила слова: 6.51

Пипец, буст только ради сериализации?
Проблема не в том, что std неправильно работает, а том, что ты сам непонимаешь того, что ты делаешь.
C#
fwrite(&vD.begin(), sizeof(Dis), vD.size(), db);
Блеать, сделайте меня это разувидеть. Пральна хуярим в файл целиком структуру данных с указателями, а затем считываем и надеемся что в заданных адресах памяти будут лежать именно нужные нам данные =)
Записан

Work, buy, consume, die
Frozzeg    ↓ 
14 Декабрь, 2011, 10:52:16 , спустя 31 минуту 38 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5501
Сила слова: 1.67

Nyaah, насколько я понял, в приведенном выше примере в файл записывается только адрес вектора :D
Записан
Nyaah    ↓ 
14 Декабрь, 2011, 10:55:00 , спустя 2 минуты 44 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 34
Сообщений: 522
Сила слова: 6.51

не, мне кажется vD всё таки вектор, а не указатель на вектор
Записан

Work, buy, consume, die
AlexanderC    ↓ 
14 Декабрь, 2011, 11:52:02 , спустя 57 минут 2 секунды
НЕ ХУЕТА! ХУЕТА!


Карма: 1
Сообщений: 140
Сила слова: 0.71

Nyaah, как бы ты записал в файл данный вектор с структурами без сериализации?
подскажи?
Спустя 2 минуты 7 секунд добавил
...Frozzeg- функции передаётся адрес первого элемента из вектора.
Nyaah- ни std а stl ;)
Спустя 2 минуты добавил
Пипец, буст только ради сериализации?
вообще-то можно только нужный компонент использовать из либы ;)
Спустя 1 минуту 57 секунд добавил
и вообще ещё буст использовал для создания потоков(многопоточности), так что уж извиняйте- велосипеды не по мне
Записан

*Не всё  Windows™ что виснет, не всё  Linux что "да ну его..."
Nyaah    ↓ 
15 Декабрь, 2011, 10:27:31 , спустя 10 часов 35 минут 29 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 34
Сообщений: 522
Сила слова: 6.51

Nyaah, как бы ты записал в файл данный вектор с структурами без сериализации?
Последовательно записать все элементы в файл не судьба? Только не так же, как ты вектор записывал, а поочерёдно все поля, друг за дружкой в определённом порядке.
 
...Frozzeg- функции передаётся адрес первого элемента из вектора.
Я же говорю не понимаешь, что делаешь...
vector<Dis> !== Dis[length], это абсолютно разные вещи, и &vD - это не первый элемент вектора, это адрес самого вектора.
 
Nyaah- ни std а stl ;)
Вот ни всё ли равно.
 
и вообще ещё буст использовал для создания потоков(многопоточности), так что уж извиняйте- велосипеды не по мне
Да бля, просто скажи, что не знаешь как поток новый создать
Записан

Work, buy, consume, die
AlexanderC    ↓ 
15 Декабрь, 2011, 06:23:30 , спустя 7 часов 55 минут 59 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 1
Сообщений: 140
Сила слова: 0.71

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

Телега?
Спустя 1 минуту 29 секунд добавил
Я же говорю не понимаешь, что делаешь...
vector<Dis> !== Dis[length], это абсолютно разные вещи, и &vD - это не первый элемент вектора, это адрес самого вектора.
http://www.cplusplus.com/reference/stl/vector/begin/
Спустя 18 секунд добавил
AlexanderC
Nyaah- ни std а stl ;)
Вот ни всё ли равно.
Нет...
Спустя 4 минуты 7 секунд добавил
Да бля, просто скажи, что не знаешь как поток новый создать
Есть много способов, многие отпадают так как компилируется без /clr (несовместимость с остальными опциями консольного приложения), и чем буст не устраивает? Вы другой религии?
Записан

*Не всё  Windows™ что виснет, не всё  Linux что "да ну его..."
Nyaah    ↓ 
15 Декабрь, 2011, 08:09:08 , спустя 1 час 45 минут 38 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 34
Сообщений: 522
Сила слова: 6.51

бегин я незаметил, сорри, но он возвращает итератор, а не массив, ты все равно не прав )
И да я не против буста, он охуенен, так же как и qt, так же как флекс в ас3, но меня просто нервирует, когда неразорбравшись даже в азах начинают их использовать.
Записан

Work, buy, consume, die
AlexanderC    ↓ 
18 Декабрь, 2011, 11:55:25 , спустя 2 дня 15 часов 46 минут 17 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 1
Сообщений: 140
Сила слова: 0.71

... нервный ты какой-то...
 
зы я и не писал что begin возвращает массив )... ну внимательность это отдельная тема...
 
а азы, что же подразумевается под этим? (для тебя)
 
Кстати, так и не был предложен метод записи без буста?...
Записан

*Не всё  Windows™ что виснет, не всё  Linux что "да ну его..."
Nyaah    ↓ 
18 Декабрь, 2011, 07:41:19 , спустя 7 часов 45 минут 54 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 34
Сообщений: 522
Сила слова: 6.51

Это после работы, так как полторы недели ипался с админкой на флексе, которая была паписана хер знает как недавно уволенным программистом. Вот он тоже не гладя в мануал херачил все данные в эррей коллекшены, не думая совершенно, нужны емы эвенты, не нужны... Херня, что у менеджеров, для которых все это писалось дохлые компики на атомах, и при загрузке сотни другой записей все начинает дико тормозить. А проблема оказалась именно в том, что ArrayCollection во флексе расширяет эвент диспатчер и при любом чихе, коллекция срёт кучей эвентов в очередо событий, как оказалось Vector в экшен скрипте на два где-то порядка шустрее работает, вот я эту куйню перелопачивал, а ты под горячую руку вместе с бустом попал, не принимай близко к сердцу xD
Азы это понимание как работает си с памятью - человек должен понимать, что std::vector.begin() - это итератор, то есть объект который внутрях своих где-то ссылается на сам вектор, либо на массив данных в векторе, в зависимости от реализации, что манипулировать с ним это манипулировать только одним единственным элементом. Что функция fwrite принимает первым аргументом указатель на область памяти, из которой будет скопированы данные в файл, и что если тебе нужно задампить массив данных, то нужно передвать указатель именно на массив.
Использование буста для сериализации не самый плохой метод, но ты знаешь как он работает? Ты уверен в том, что после того как ты в структуре Dis поля местами поменяешь, либо добавишь новое свойство, у тебя старые сериализованные файлы будут адекватно считываться?
По поводу записи, был пердложен метод, но ту его телегой обозвал ) Если ты пишешь приложение не только для себя, то он на мой взгляд единственно верный, при условии что нужно именно в файл писать. Если не обязательно лить данные в файл, я бы подумал не писать ли их в бд. Запись последовательно в определённом формате (который ты собственно сам должен придумать), с указанием сигнатуры текущей версии файла, гарантирует тебе:
а) отсутствие оверхеда
б) в будущем отсутствие гемора с обратной совместимостью
в) ты точно будешь знать как что работает, а не так, что звонят девочкам в тп со словами "У меня файл не загружается в новой версии", они тебя спрашивают, что случилось, на что ты им ответишь, "а хз, сериализация в бусте так работает"
 
Ещё. Если пишешь на плюсах, бы ло бы неплохо юзать всётаки стримы, а не f* функции и классы вместо структур. Создаёшь класс Discipline учишь его работать с std::istream и std::ostream, после чего для записи в файл нужно будет только написать (это я так, структура файла должна быть удобочитаемой для программы, это не руководство к действию =)) что-то типа:
C#
void save(const std::vector<Discipline> &data) {
    ofstream outFileStream("save.bin");
    std::vector<Discipline>::const_iterator i;
 
    for (i = data.begin(); i != data.end(); ++i) {
        outFileStream << (*i);
    }
    outFileStream.flush();
    outFileStream.close();
}
« Последнее редактирование: 18 Декабрь, 2011, 07:41:19 от Nyaah » Записан

Work, buy, consume, die
Страниц: [1]
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd, artoodetoo, mario