Форум — Ответы     (  К темам )
 ?  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)
Уважаемый, Георгий!
Спасибо за содействие!!! Идея ясна, буду пробовать.