написала код — чтение-запись в файл (записывается всё корректно в 1 раз, если нет ещё файла), а при чтении (fscanf) VC++ вылетает. не могу понять почему, помогите найти ошибку
void CLinesView::EndGame()
{
CDEnd dlg(field->m_Points);
dlg.DoModal();
FILE *stream;
CString *buf1, *buf3;
int i=0, point[20], j,num=-1, buf2, buf4;
CString *name[20];
char str;
if( (stream=fopen( "data.ls", "r" )) == NULL )
{
//работает корректно 1 раз создаёт файл
stream = fopen( "data.ls", "w" ); //файла нет,создали новый
fprintf(stream, "%s%d",dlg.m_name,field->m_Points);
fclose(stream);
}else
{
while (!feof(stream))
{
///////////////читаем массив, ТУТ ВОЗНИКАЕТ ОШИБКА
fscanf(stream,"%s%d",str, point[i]);
name[i]->Format("%s",str);
TRACE("%s,%d",name[i],&point[i]);
i++;
};
fclose(stream);
for (j=0;j<i;j++)
{
if (field->m_Points>point[j]){num=j; break;}
};
buf1=name[num]; buf2=point[num];
name[num]->Format("%s",dlg.m_name);
point[num]=field->m_Points;
if (num<20)
{
if (i<20) {i++;};
for (j=num+1;j<i-1;j++)
{
buf3=name[j+1];buf4=point[j+1];
name[j+1]=buf1;point[j+1]=buf2;
buf1=buf3;
buf2=buf4;
}
}
stream = fopen( "data.ls", "w" ); //файла нет,создали новый
for (j=0;j<i;j++)
{
fprintf(stream, "%s",name[j]);
fprintf(stream, "%i",point[j]);
fclose(stream);
};
};
Здравствуйте, anais, Вы писали:
A>написала код — чтение-запись в файл (записывается всё корректно в 1 раз, если нет ещё файла), а при чтении (fscanf) VC++ вылетает. не могу понять почему, помогите найти ошибку
Информация для размышления:
A> fscanf(stream,"%s%d",str, point+i);
int intvar;
fscanf(str,"%d",&intvar);
так тоже вылетает, не понимаю почему... просто появляется модальное окно что-то вроде 0х00000.....
Здравствуйте, e-Xecutor, Вы писали:
EX>Здравствуйте, anais, Вы писали:
A>>написала код — чтение-запись в файл (записывается всё корректно в 1 раз, если нет ещё файла), а при чтении (fscanf) VC++ вылетает. не могу понять почему, помогите найти ошибку
EX>Информация для размышления:
EX>A>> fscanf(stream,"%s%d",str, point+i);
EX>int intvar;
EX>fscanf(str,"%d",&intvar);
EX>
Мудрено товарищ ответил... Наверное, сразу умным родился.
В общем, в fscanf надо передавать адрес переменной, то есть вместо
fscanf(stream,"%s%d",str, point[i]);
надо написать
fscanf(stream,"%s%d",str, &point[i]);
а вот в последующем
TRACE("%s,%d",name[i],&point[i]);
наоборот, & не нужен
TRACE("%s,%d",name[i], point[i]);
Что касается str — ее надо заменить на массив char, а не на просто char str.
char str[число_большее_чем_максимальная_длина_строки];
а вот CString *name[20] наоборот надо сделать массивом объектов а не указателей.
CString name[20];