Форум — Ответы ( К темам )
? | 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(); //êîïèÿ íåïîéìè ÷åãî this->Data[ind]->Write(Buf); //çàïèñü íåïîéìè ÷åãî, íåïîéìè êóäà }; }; 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) | |
Уважаемый, Георгий! Спасибо за содействие!!! Идея ясна, буду пробовать. |