Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > проблема с readfile


Автор: nitrikc 10.5.2011, 16:32
void __fastcall TForm1::N1Click(TObject *Sender)
{BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped);
HANDLE hFile;DWORD dw;LPVOID arr;
char *file_name;
if(OpenDialog1->Execute())
{
 file_name=OpenDialog1->FileName.c_str();
 FILE *file;
 file = fopen( file_name, "r" );

if( file == 0 )
{ShowMessage("Ôàéë íå íàéäåí");}
else
{hFile=file_name;
do {
unsigned long size=GetFileSize(file_name,NULL);
Edit1->Text=size;
char* arr;//=(char*)VirtualAlloc(NULL,size,MEM_COMMIT,PAGE_READWRITE);
ReadFile(hFile,arr,size,&dw,NULL);                                                                                 //ругается
} while (EOF==1) ; // ïîêà îí íå ðàâåí ñèìâîëó êîíöà ñòðîêè
Memo1->Text=file_name;
fclose(file);
}}
else
return ;
}
вот часть программы. не могу понять в чем ошибка. извиняюсь за оформление smile 

Автор: borisbn 10.5.2011, 17:48
Цитата(nitrikc @  10.5.2011,  16:32 Найти цитируемый пост)
file_name=OpenDialog1->FileName.c_str();

так делать нельзя, т.к. FileName создаёт временный объект AnsiString, который после этой строчки не жилец. Нужно так
Код

AnsiString file_name = OpenDialog1->FileName;
FILE *file;
file = fopen( file_name.c_str(), "r" );

Цитата(nitrikc @  10.5.2011,  16:32 Найти цитируемый пост)
hFile=file_name;

это ещё что ???
hFile - HANDLE
file_name - char*

Цитата(nitrikc @  10.5.2011,  16:32 Найти цитируемый пост)
char* arr;//=(char*)VirtualAlloc(NULL,size,MEM_COMMIT,PAGE_READWRITE);

зачем заремил ? было всё правильно. хотя лучше
Код

char * arr = new char[ size ];

только потом (в конце) не забудь сделать ему delete []arr;

Цитата(nitrikc @  10.5.2011,  16:32 Найти цитируемый пост)
} while (EOF==1) ; // ïîêà îí íå ðàâåí ñèìâîëó êîíöà ñòðîêè

зачем do...while, если ты собираешься читать весь файл одним блоком ?

Цитата(nitrikc @  10.5.2011,  16:32 Найти цитируемый пост)
 извиняюсь за оформление

выделяешь код и нажимаешь кнопку "Код" сверху справа над полем редактирования

Автор: nitrikc 11.5.2011, 03:09
 smile спасибо за подробное объяснение ошибок. hFile ... а как указать на открытый файл?
>>>>>>>>>>>>>>зачем do...while, если ты собираешься читать весь файл одним блоком ?
потом сделаю что бы блоками. тестить хочу на маленьких файлах. потом в поток хочу переделать. smile 

Автор: borisbn 11.5.2011, 06:22
> hFile ... а как указать на открытый файл
Нужно пользоваться одним набором функций для открытия/чтения/закрытия. Либо CreateFile/ReadFile/CloseHandle либо fopen/fread/fclose
Почитай про эти ф-ции. В их описании есть примеры использования

Автор: xvr 11.5.2011, 11:17
Конструкция (EOF==1) тождественно равна false.
Рекомендую почитать букварь по С  smile 

Автор: nitrikc 12.5.2011, 23:29
а getfile можно использовать? 

Автор: borisbn 12.5.2011, 23:34
WTF is getfile?

Автор: nitrikc 12.5.2011, 23:52
опечатался getline. чтобы файл целиком прочитать.

Автор: volatile 13.5.2011, 01:29
Цитата(nitrikc @  12.5.2011,  23:52 Найти цитируемый пост)
опечатался getline. чтобы файл целиком прочитать. 

ЗАЧЕМ ??
вам же сказали какие функции использовать.
Или нормальные герои всегда идут в обход?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)