Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2010, 03:25   #1
inzener-tolik
Пользователь
 
Регистрация: 06.03.2010
Сообщений: 12
По умолчанию Файлы(выдаёт ошибку).

Народ помогите найти ошибку! Нужно в файле подсчитать кол-во слов которые выделены курсивом с помощью html-тэгов и вывести на форму.
Код:
void __fastcall TForm1::Button7Click(TObject *Sender)
{
bool hGD;
PBYTE pBuf;
WIN32_FIND_DATA FindFileData, FindFileData1;
String str;
int i=0,j=0;
DWORD fSize, fhSize; 
HANDLE hFile, hMapFile;
str="D:\\work";
//while (j<=n)


while (j<=96)

{
AnsiString FF=str+IntToStr(j)+".html";
hFile  = CreateFile(FF.c_str(),
							GENERIC_READ | GENERIC_WRITE ,
							FILE_SHARE_READ | FILE_SHARE_WRITE,
							NULL,
							OPEN_EXISTING,
							FILE_ATTRIBUTE_NORMAL,
							0);


fSize = GetFileSize(hFile, &fhSize);
hMapFile  = CreateFileMapping(hFile, 
							   NULL, 
							   PAGE_READWRITE, 
							   fhSize, 
							   fSize, 
							   NULL);


pBuf =(PBYTE) MapViewOfFile(hFile,  
						  FILE_MAP_READ|FILE_MAP_WRITE,  
						  0,
						  0, 
						  0);



//обработка массива

int i=0, n, k=0;

 for(i = 0; i < strlen(pBuf); i++)
  {
	  if ((pBuf[i]=='<') & (pBuf[i+1]=='I') & (pBuf[i+2]=='>'))
		{
		   n=1;
		   k=k-4;
			while (n==1)
				{

				if((pBuf[i]=='<') & (pBuf[i+1]=='/') & (pBuf[i+2]=='I') & (pBuf[i+3]=='>'))
					{
					n=0;
					}

			   k++;
		   i++ ;	}
		}
   }

   
	 CloseHandle(hMapFile);
	 UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);
j++;
}

}
Выдаёт ошибку.
inzener-tolik вне форума Ответить с цитированием
Старый 19.03.2010, 09:10   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Что за ошибку выдает?
p51x вне форума Ответить с цитированием
Старый 19.03.2010, 22:36   #3
inzener-tolik
Пользователь
 
Регистрация: 06.03.2010
Сообщений: 12
По умолчанию

Access violation at address 3299E7C0 in module 'СС329MT'.DLL. Read of address 00000000
inzener-tolik вне форума Ответить с цитированием
Старый 19.03.2010, 22:43   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
 for(i = 0; i < strlen(pBuf); i++)
  {
	  if ((pBuf[i]=='<') & (pBuf[i+1]=='I') & (pBuf[i+2]=='>'))
Выход индекса за пределы. Нет проверок на ошибки.
p51x вне форума Ответить с цитированием
Старый 19.03.2010, 23:03   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Во-первых, если в папке
Код:
str="D:\\work\\";
Во-вторых
Код:
MapViewOfFile(hMapFile
В-третьих
Код:
	 CloseHandle(hMapFile);
	 UnmapViewOfFile(pBuf);

//CloseHandle(hMapFile); это лишнее
eoln вне форума Ответить с цитированием
Старый 23.03.2010, 23:46   #6
inzener-tolik
Пользователь
 
Регистрация: 06.03.2010
Сообщений: 12
По умолчанию

Все-равно ошибка!
inzener-tolik вне форума Ответить с цитированием
Старый 24.03.2010, 00:26   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от inzener-tolik Посмотреть сообщение
Все-равно ошибка!
Какая ошибка? С выше приведёнными мною и p51x замечаниями протестиовал на 2-х файлах - находит что надо и ошибки я не вижу.
eoln вне форума Ответить с цитированием
Старый 24.03.2010, 00:36   #8
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Код:
Access violation at address 3299E7C0 in module 'СС329MT'.DLL. Read of address 00000000
это означает что ты где-то пытаешься обратиться к недоступной области памяти(ошибка сегментации) . Скорей всего проблема тут:
Код:
if ((pBuf[i]=='<') & (pBuf[i+1]=='I') & (pBuf[i+2]=='>'))
и тут
Код:
if((pBuf[i]=='<') & (pBuf[i+1]=='/') & (pBuf[i+2]=='I') & (pBuf[i+3]=='>'))
во-первых вы пишете в условиях побитовое И, это не правильно. Вам нужно логическое И, пишется так: &&
во-вторых у вас цикл идет до strlen(pBuf)-1, а вот тут:

Код:
 (pBuf[i+1]=='I') & (pBuf[i+2]=='>'))
и тут
Код:
 (pBuf[i+1]=='/') & (pBuf[i+2]=='I') & (pBuf[i+3]=='>')
как раз и вылетает ошибка сегментации.

либо сделайте, чтобы цикл шел пока i < strlen(pBuf)-3, либо перестройте код.
NiCola999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
htaccess выдаёт ошибку memka PHP 11 14.04.2009 01:16
Выдаёт ошибку: acos DOMAIN error,полсе нажатия окей,ещё одну ошибку pow OWERFLAW ERROR prikolist Общие вопросы C/C++ 4 10.04.2009 20:27
Выдаёт ошибку DM_bite Помощь студентам 2 08.08.2008 10:33
Почему ошибку выдаёт? Inbox Общие вопросы Delphi 14 24.06.2007 02:15