операторы new и delete
В консольном приложении есть некоторый буфер:
char* buf;
Использую его в цикле:
while (!feof(streamIN))
{
buf = new char[BUF_SIZE];
memset(str, 0, BUF_SIZE);
...
delete[] buf;
}
Так вот. Если BUF_SIZE = 10, то вылетает ошибка. Если поставить его 100, то все ОК. Как это понимать???
2. Текст ошибки тоже желательно )
Лучше напиши всё что у тебя внутри цикла. И зачем тебе вообще в цикле память выделять каждый раз?
bool ConvLog(char* fileIN, char* fileOUT)
{
FILE* streamIN;
FILE* streamOUT;
if( ((streamIN = fopen(fileIN, "r+t" ))!=NULL) &&
((streamOUT = fopen(fileOUT, "w+t" ))!=NULL) )
{
while (!feof(streamIN))
{
buf = new char[BUF_LEN];
memset(buf, 0, BUF_LEN);
fgets(buf, 100, streamIN);
if (buf[0]=='$')
{
tel = new char[TEL_LEN];
memset(tel, 0, TEL_LEN);
strcpy(tel, buf+1);
fgets(buf, 10, streamIN);
for(int i=0; i<10; i++)
{
str = new char[STR_LEN];
fgets(buf, 100, streamIN);
for (int y=0; y<10; y++)
{
memset(str, 0, STR_LEN);
strcpy(str, tel);
LastDigit(str+4, i*10+y);
for(int z=0; z<6; z++)
{
str[8+z]=buf[y*7+z];
}
fputs(str, streamOUT);
}
delete[] str;
}
delete[] tel;
}
delete[] buf;
}
fclose(streamIN);
fclose(streamOUT);
return true;
}
else
return false;
}
Я понимаю, что совсем не обязательно выделять память в цикле (совсем даже наоборот), но так уж получилось... и вот столкнулся с проблемой! Если TEL_LEN меньше 25, то эта функция вызывает ошибку, если больше - ошибки нет. Вопрос не в том как нужно писать, а в том почему возникает такая проблема.
fgets(buf, 100, streamIN); //!!!! 100
Читаешь в паямть по указателю buf, которой ты выделил всего 10 байт -
100 байт из потока. - ессествено возникает ошибка. ПРичём ошибка я
скорее всего вылетает в процессе выполнения программы.
Ну и вот еще что:
strcpy(tel, buf+1);
Ты уверен, что (buf+1) указывает на строку закрытую двоичным нулём
(т. е. '\0')??? - если нет, то strcpy(tel, buf+1); - возможно будет приводить к ошибке.
Лучше использовать strncpy(tel, buf+1, TEL_LEN);
-----------------------------------------------
Вот это то что увидел беглым взглядом.
#define TEL_LEN 10
#define BUF_LEN 100
#define STR_LEN 50
Поэтому fgets(buf, 100, streamIN) - вполне справедливо, но конечно лучше перепешу на fgets(buf, BUF_LEN, streamIN).
Нашол я в чем проблема - гон исключительно мой. Лог файл, который обрабатывает моя функция имел следующий вид:
...
$7400
614067 663945 059687 594525 093055 044870 781313 166890 126626 510525
282804 632782 710702 435471 731300 445827 641549 249291 996663 749551
481525 049237 591198 624040 963892 200071 838362 702309 236170 877169
...
И первая строка имеет длинну не 6 байт (как я наивно пологал), аа 21. Отсюда и все проблемы...
Просто нужно заменить strcpy(tel, buf+1); на strncpy(tel, buf+1, TEL_LEN); и все!
Всем спасибо за внимание! Закрываем тему.