Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Помогите побороть fgets


Автор: mrTeapot 12.4.2006, 17:36
Доброе время, господа аксакалы.
Проблема вот в чем. Пытаюсь написать в VC++ 6.0 незатейливую утилиту, обрабатывающую архив журнала "Компьютерра" за
1995-04 гг. в формате HTML. Невинный вроде бы код

const StrBufSize = 5;
char* StrBuff[StrBufSize];
const MaxStrLength=4*1024;

...

// Корректное (смею думать) выделение памяти под StrBuff - 4096 байт для каждого из 5 элементов

...
Index=fopen(cPath, "rt");
...

for(int k=0; k<StrBufSize;k++)
{
if(fgets(StrBuff[k], MaxStrLength, Index) ==NULL)
{
CloseHandlers(4);
return;
}
else
{

...

- так вот, оный код исправно срабатывает несколько десятков раз и выдает устойчивую ошибку на одном конкретном HTML-файле.
При k=3 fgets считывает очередную строку не полностью, разрывая ее в одном конкретном месте. Выделенных 4 килобайт он явно
не "выбирает" (смеха ради увеличивал MaxStrLength до 44 к - результат тот же). При следующей итерации (k=4) -

Debug assertion failed; file fgets.c ; line 59.

После else в StrBuff ничего не пишется - только поиск вхождений с помощью strstr и strchr.
До конца обрабатываемого файла весьма далеко. Архив лежит на винте, а не на CD. Просмотр HTML кода злокачественного файла с индикацией непечатных символов ничего не дал. Помогите же моему горю, господа аксакалы, и да продлит Аллах дни всякого ответившего.





Автор: Dov 12.4.2006, 20:53
Для начала так попробуй.
Код
const StrBufSize = 5;
const MaxStrLength = 256;
char StrBuff[StrBufSize][MaxStrLength];


Автор: mrTeapot 13.4.2006, 10:01
Надо же... Все заработало. Спасибо, брат сионист. Что, однако ж, это было? И есть ли способ это обороть, кроме статического определения?

Автор: Dov 14.4.2006, 04:25
Цитата(mrTeapot @ 13.4.2006, 09:01 Найти цитируемый пост)
Что, однако ж, это было?


mrTeapot, ты объявил массив строк(или массив указателей на тип char), но память под строки не выделил.
Цитата(mrTeapot @ 13.4.2006, 09:01 Найти цитируемый пост)
И есть ли способ это обороть, кроме статического определения?


Можно динамически тоже, вопрос только в том, а зачем это нужно. mrTeapot, что делает твоя прога или что она должна делать, конкретно. И зачем нужен массив, может быть без него можно обойтись?

Автор: mrTeapot 14.4.2006, 22:41
Цитата

mrTeapot, ты объявил массив строк(или массив указателей на тип char), но память под строки не выделил.


Не думаю, что дело в этом. Не могу привести старый код с динамическим выделением, т. к. переписал
его со статическим, но поверь на слово - я не настолько teapot и с new знаком. Опять же - я указывал, что
Цитата

код исправно срабатывает несколько десятков раз


- нешто такое бывает без выделения? Впрочем, если была ошибка при вылелении памяти, теперь об этом не узнать.
Прога моя группирует статьи заданного автора в HTML -файлы по годам, формирует ПСС, так сказать. Теперь-то это неважно - софтинка вроде работает исправно. Я понимаю, что в данном конкретном случае без динамического массива можно обойтись, хотелось бы только понять на будущее, в чем было дело. Ну да теперь чего уж...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)