|
AlexanderC ↓
|
 |
|
14 Декабрь, 2011, 02:42:55
|
НЕ ХУЕТА!
ХУЕТА!
|
Карма: 1
Сообщений: 140 Сила слова: 0.71
|
Есть stl::vector из структур
#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 это вектор структур.
Есть проблемка. При записи в файл:
// FILE *db;
fwrite (&vD. begin(), sizeof(Dis ), vD. size(), db );
всё ок, но вот при чтении:
// 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
|
|
|
|
|
|
Записан
|
|
|
|
|
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 неправильно работает, а том, что ты сам непонимаешь того, что ты делаешь.
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, после чего для записи в файл нужно будет только написать (это я так, структура файла должна быть удобочитаемой для программы, это не руководство к действию =)) что-то типа:
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
|
|
|
|