link5328 link5329 link5330 link5331 link5332 link5333 link5334 link5335 link5336 link5337 link5338 link5339 link5340 link5341 link5342 link5343 link5344 link5345 link5346 link5347 link5348 link5349 link5350 link5351 link5352 link5353 link5354 link5355 link5356 link5357 link5358 link5359 link5360 link5361 link5362 link5363 link5364 link5365 link5366 link5367 link5368 link5369 link5370 link5371 link5372 link5373 link5374 link5375 link5376 link5377 link5378 link5379 link5380 link5381 link5382 link5383 link5384 link5385 link5386 link5387 link5388 link5389 link5390 link5391 link5392 link5393 link5394 link5395 link5396 link5397 link5398 link5399 link5400 link5401 link5402 link5403 link5404 link5405 link5406 link5407 link5408 link5409 link5410 link5411 link5412 link5413 link5414 link5415 link5416 link5417 link5418 link5419 link5420 link5421 link5422 link5423 link5424 link5425 link5426 link5427 link5428 link5429 link5430 link5431 link5432 link5433 link5434 link5435 link5436 link5437 link5438 link5439 link5440 link5441 link5442 link5443 link5444 link5445 link5446 link5447 link5448 link5449 link5450 link5451 link5452 link5453 link5454 link5455 link5456 link5457 link5458 link5459 link5460 link5461 link5462 link5463 link5464 link5465 link5466 link5467 link5468 link5469 link5470 link5471

Форум — Ответы     (  К темам )
 ?  Fantom: Мусор при чтении бинарного файла (03-03-2003 15:59:40)
Мужики помогите, не могу понять в чем дело. Пишу функцию по работе с бинарным файлом на CB 5.0 код ниже; все как бы класно вычитываю файл в (unsigned char *), но у меня стабильно в конце этого списка 4 байта мусора :( Причем когда создаю указатель (Buffer = new unsigned char[размер]) то он создается тоже 4-х байтным с мусором, кот. потом и будет в нем при чтении файла, токо в самом конце.

Как победить??? Зараннее благодарен!!!

// Кусок кода
AnsiString _fname;
THandle iFileHandle;
unsigned char *Buffer = NULL;
//----------------------------------------

iFileHandle = FileOpen(_fname, fmOpenRead);
if(iFileHandle != 0)
{
try
{
_fileLen = FileSeek(iFileHandle,0,2);
FileSeek(iFileHandle,0,0);

Buffer = new unsigned char[_fileLen];

FileRead(iFileHandle, Buffer, _fileLen);
FileClose(iFileHandle);

delete [] Buffer;

}
catch(...)
{
FileClose(iFileHandle);
};
};
 Георгий (03-03-2003 19:39:55)
я работаю с файлами через Win32 API и не знаю горя
скорость чнения/записи:
стандартная библиотека 3MB/s
Win32 API максимум возможностей винта (25/15 MB/s)
размер файла определяю как GetFileSize
читаю ReadFile
пишу WriteFile
и нет ни одного сбоя...
 Fantom (04-03-2003 13:09:07)
Георгий, а можешь кинуть примерчик? У меня проблема двойная :) и читаю из файла, который далеко не текстовый, т.е. гора нулевых символов(концов строк) а у меня в бужер информация попадает только до первого конца строки :(
Думаю это из-за того что я объявил буффер как: (unsigned char *), но я пробовал и (__int8 *) таже беда. Не подскажешь чего может быть?
Зараннее благодарен за помошь!!!
 Георгий (04-03-2003 14:05:52)
bool TMemoryDatabase::SetConnectionFile(const AnsiString& FileName,BaseData* e,void (*LoadIndicator)(int,int),bool NeedWrite)
{
DWORD nRec,BytesReaded,l;
int i,j,ind;
void* Buf;
bool succ;
if (NeedWrite)
{
hFile=CreateFile( FileName.c_str(),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ,NULL,
OPEN_ALWAYS,
FILE_FLAG_WRITE_THROUGH|FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
}
else
{
hFile=CreateFile( FileName.c_str(),
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
OPEN_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
};
if (hFile==INVALID_HANDLE_VALUE)
return false;
nRec=GetFileSize(hFile,NULL);
nRec/=e->GetSize();
Buf=new char[e->GetSize()];
this->t->BeginWrite();
j=nRec;//òîëüêî, ÷òîá èçáàâèòüñÿ îò ïðåäóïðåæäåíèÿ

for (i=0,ind=0;(ind<this->MaxElements)&&(i<j);i++,ind++)
{
if (LoadIndicator)
LoadIndicator(i,nRec);
ReadFile(hFile,Buf,e->GetSize(),&BytesReaded,NULL);
if ((BytesReaded!=e->GetSize()))
{
ind--;
break;
};
succ=e->Write(Buf);
if (!succ)
ind--;
else
if (!e->InMemory())
ind--;
else
{
this->Data[ind]=e->MakeCopy(); //&#234;&#238;&#239;&#232;&#255; &#237;&#229;&#239;&#238;&#233;&#236;&#232; &#247;&#229;&#227;&#238;
this->Data[ind]->Write(Buf); //&#231;&#224;&#239;&#232;&#241;&#252; &#237;&#229;&#239;&#238;&#233;&#236;&#232; &#247;&#229;&#227;&#238;, &#237;&#229;&#239;&#238;&#233;&#236;&#232; &#234;&#243;&#228;&#224;
};
};
delete Buf;
this->ElementCount=ind;
this->WorkFileName=FileName;
this->t->EndWrite();
this->Sort();
if (!NeedWrite)
{
CloseHandle(hFile);
hFile=0;
};
return true;
};

а если в 2-х словах, то
hFile=CreateFile( FileName.c_str(),
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,
OPEN_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
nRec=GetFileSize(hFile,NULL);
ReadFile(hFile,Buf,e->GetSize(),&BytesReaded,NULL);
CloseHandle(hFile);
 Fantom (04-03-2003 15:22:43)
Уважаемый, Георгий!
Спасибо за содействие!!! Идея ясна, буду пробовать.