link4970 link4971 link4972 link4973 link4974 link4975 link4976 link4977 link4978 link4979 link4980 link4981 link4982 link4983 link4984 link4985 link4986 link4987 link4988 link4989 link4990 link4991 link4992 link4993 link4994 link4995 link4996 link4997 link4998 link4999 link5000 link5001 link5002 link5003 link5004 link5005 link5006 link5007 link5008 link5009 link5010 link5011 link5012 link5013 link5014 link5015 link5016 link5017 link5018 link5019 link5020 link5021 link5022 link5023 link5024 link5025 link5026 link5027 link5028 link5029 link5030 link5031 link5032 link5033 link5034 link5035 link5036 link5037 link5038 link5039 link5040 link5041 link5042 link5043 link5044 link5045 link5046 link5047 link5048 link5049 link5050 link5051 link5052 link5053 link5054 link5055 link5056 link5057 link5058 link5059 link5060 link5061 link5062 link5063 link5064 link5065 link5066 link5067 link5068 link5069 link5070 link5071 link5072 link5073 link5074 link5075 link5076 link5077 link5078 link5079 link5080 link5081 link5082 link5083 link5084 link5085 link5086 link5087 link5088 link5089 link5090 link5091 link5092 link5093 link5094 link5095 link5096 link5097 link5098 link5099 link5100 link5101 link5102 link5103 link5104 link5105 link5106 link5107 link5108 link5109 link5110 link5111

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