Re: СArray
От: Курилка Россия http://kirya.narod.ru/
Дата: 04.04.02 17:17
Оценка:
Здравствуйте Xenia, Вы писали:

X>Здравствуйте!

X>Имеется такой код:

X>
X>struct Info{
X>    CString razd;
X>    CString stroka;
X>};
X>CArray<Info,Info> nastr;
X>//и две фуекции - одна создает файл а другая затем его читает
X>void CNastr::CreateFile()
X>{
X>    Info inf;
X>    CFile file("nastr.nas", CFile::modeWrite | CFile::modeCreate);
X>    CArchive ar(&file, CArchive::store);
X>    int ArSize=nastr.GetSize();
X>    ar.Write(&ArSize,sizeof(int));
X>    for (int i=0;i<ArSize;i++)
X>    {
X>    inf = nastr.GetAt(i);
X>    ar.Write(&inf,sizeof(Info));
X>    }
X>    ar.Close();
X>    file.Close();
X>}

X>void CNastr::Init()
X>{
X>   CFile file("nastr.nas", CFile::modeRead);
X>   CArchive ar(&file, CArchive::load);
X>   int ArSize;
X>   Info inf=new Info;
X>   ar.Read(ArSize,sizeof(int));
X>   for (int i=0;i<ArSize;i++)
X>   {
X>      ar.Read(inf,sizeof(Info));
X>      nastr.Add(inf);
X>   }
X>   ar.Close();
X>   file.Close();
X>}
X>

X>При чтении файла вываливается Assertion Failed, File dbgheap.c Line 1011 Expression _CrtlsValidHeapPointer(pUserData)
X>Чего ему не хватает
X>Пробовала выделять память динамически, но это не помогает.

ну ты посмотри, что у тебя происходит:
ты пишешь Info, а в нём 2 строки, которые есть лишь место под вспом. переменные для строки (сами строки динамически получаются, там указатели). Надо сделать типа

clas Info{
 CString razd;
 CString stroka;
}

CArchive& operator <<( CArchive& ar, const Info& info ){
  return ar << info.razd << info.stroka;
};

CArchive& operator >>( CArchive& ar, const Info& info ){
  return ar >> info.razd >> info.stroka;
};

//в CNastr::CreateFile()
ar >> inf;

//в CNastr::Init()
ar << inf;


и всё должно быть пучком! (Надеюсь...)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.