Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |  |  |
вобщем вопрос решился... надо было обнулять Buffer... delete... 03.02.05 10:15 Число просмотров: 1670
Автор: Duke Статус: Незарегистрированный пользователь
|
вобщем вопрос решился... надо было обнулять Buffer... delete оказывается недостаточно.
вот код который нормально работает :
int iFH, iFL, iBR, i, j, ID;
char *Buffer =0; // << --- here -----
AnsiString str, st1[7],subdir,tmpstr;
iFH = FileOpen(FileName, fmOpenRead);
DWORD Error = GetLastError();
iFL = FileSeek(iFH,0,2);
FileSeek(iFH,0,0);
Buffer = new char[iFL+1];
memset(Buffer,NULL,iFL+1); // << ---- here ----
iBR = FileRead(iFH, Buffer, iFL);
FileClose(iFH);
OemToChar(Buffer,Buffer);
j=0;
str=EmptyStr;
for (i=0;i<iBR;i++)
{
if(Buffer[i]!=';')
{
str+=Buffer[i];
}
else
{
st1[j]=str+"\0";
j++;
str=EmptyStr;
}
}
st1[j]=str;
str=EmptyStr;
delete[] Buffer;
Buffer = 0; // --- here ---
|
<programming>
|
помогите написать кусочек кода 02.02.05 15:51
Автор: Duke Статус: Незарегистрированный пользователь
|
нужно открывать файл в котором лежит типа
1;1;ХХХ;45 08 194515;31.05.2002;ОВД ИВАНОВСКОЕ Г МОСКВА;ИВАНОВ ИВАН ИВАНОВИЧ
и из этого получить массив AnsiString st1[7], соответственно из значений заключенных между ;
я делаю так:
int iFH, iFL, iBR, i, j, ID;
char *Buffer;
AnsiString str, st1[7],subdir,tmpstr;
iFH = FileOpen(FileName, fmOpenRead);
iFL = FileSeek(iFH,0,2);
FileSeek(iFH,0,0);
Buffer = new char[iFL];
iBR = FileRead(iFH, Buffer, iFL);
FileClose(iFH);
OemToChar(Buffer,Buffer);
j=0;
str=EmptyStr;
for (i=0;i<iBR;i++)
{
if(Buffer[i]!=';')
{
str+=Buffer[i];
}
else
{
st1[j]=str;
j++;
str=EmptyStr;
}
}
st1[j]=str;
delete [] Buffer;
вот это все дает access violation после десятка проходов... хз почему... может кто знает как по-другому сделать?
|
 |
access violation наверняка будет если в строке больше 6 раз... 02.02.05 16:20
Автор: ukv Статус: Незарегистрированный пользователь
|
access violation наверняка будет если в строке больше 6 раз встретится ';'
|
 |  |
да нет , в том то и дело что не может этого быть... все... 02.02.05 16:30
Автор: Duke Статус: Незарегистрированный пользователь
|
> access violation наверняка будет если в строке больше 6 раз > встретится ';' да нет , в том то и дело что не может этого быть... все файлы стандартные... выгружаются из досовской проги..
пробовал делать st1[255], все пофиг... раз 10 отрабатывает потом access violation...
|
 |  |  |
И все-таки на переполнение индекса массива надо проверять. 02.02.05 18:32
Автор: ukv Статус: Незарегистрированный пользователь
|
И все-таки на переполнение индекса массива надо проверять.
Еще всегда проверять что файл реально открылся.
OemToChar(s,s) - на не-юникоде вроде допустимо. Но: строка должна кончаться нулем. А всегда ли есть нулевой символ в считанном файле? Лучше на это тоже не расчитывать и нолик в конец добавить.
|
 |  |  |  |
вобщем вопрос решился... надо было обнулять Buffer... delete... 03.02.05 10:15
Автор: Duke Статус: Незарегистрированный пользователь
|
вобщем вопрос решился... надо было обнулять Buffer... delete оказывается недостаточно.
вот код который нормально работает :
int iFH, iFL, iBR, i, j, ID;
char *Buffer =0; // << --- here -----
AnsiString str, st1[7],subdir,tmpstr;
iFH = FileOpen(FileName, fmOpenRead);
DWORD Error = GetLastError();
iFL = FileSeek(iFH,0,2);
FileSeek(iFH,0,0);
Buffer = new char[iFL+1];
memset(Buffer,NULL,iFL+1); // << ---- here ----
iBR = FileRead(iFH, Buffer, iFL);
FileClose(iFH);
OemToChar(Buffer,Buffer);
j=0;
str=EmptyStr;
for (i=0;i<iBR;i++)
{
if(Buffer[i]!=';')
{
str+=Buffer[i];
}
else
{
st1[j]=str+"\0";
j++;
str=EmptyStr;
}
}
st1[j]=str;
str=EmptyStr;
delete[] Buffer;
Buffer = 0; // --- here ---
|
|
|