Функции чтения/записи для файла

  • Автор темы Guest_Artur_*
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest_Artur_*

#1
Здрасте всем, кто читает эти строки :)) У меня есть задача прочитать файл (он может быть как текстовый так и бинарный), и один в один создать такой же файл, тобиш побайтно переписать. Переиминововать не годиться. Какими функциями в C++ Builder можно это всё зделать? Я смотрел на FileRead и т.п. но по ходу не получилось с текстовыми файлами.
 
D

DIRT

#2
void CTAPIClientServerDlg::WriteFileBinData(LPCSTR szOutput, DWORD dwSize, BOOL bZeroFile)
{TCHAR szFilePrint[MAX_PATH] = TEXT(".\\out.txt");
static HANDLE hFile = NULL;
DWORD dwNumWritten;

if (hFile == NULL)
{
// hFile = CreateFile(szFilePrint, GENERIC_WRITE, FILE_SHARE_READ, NULL,
// bZeroFile ? CREATE_ALWAYS : OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

hFile = CreateFile(szFilePrint, GENERIC_WRITE,
FILE_SHARE_READ, NULL,
bZeroFile ? CREATE_ALWAYS : OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);


if (hFile == INVALID_HANDLE_VALUE)
AfxMessageBox("CreateFile output log file %s failed with %s\r\n");
else
SetFilePointer(hFile, 0, NULL, FILE_END);
}
if (hFile != INVALID_HANDLE_VALUE)
{
// OVERLAPPED ol = {0};
// LockFileEx(hFile, 0, 0, 1, 0, &ol);
WriteFile(hFile, szOutput, dwSize, &dwNumWritten, NULL);
// UnlockFileEx(hFile, 0, 1, 0, &ol);
}
}

#define MAX_BUFFER 256

void CTAPIClientServerDlg::ReadFileBinData(LPCSTR szOutput)
{bool bResult;
char* chRead;
DWORD dwNumByteRead=0;
HANDLE hFile = NULL;

hFile = CreateFile(szOutput, GENERIC_READ,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE
| FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY ,NULL);

if (hFile == INVALID_HANDLE_VALUE)
return;


chRead = new char[MAX_BUFFER];
for(;:)
{
bResult = ReadFile(hFile, chRead, MAX_BUFFER, &dwNumByteRead, NULL );

if(bResult && dwNumByteRead == 0)
{
break;
}

WriteFileBinData(chRead, dwNumByteRead);

}
delete [] chRead;
}
 
B

Barmutik

#3
Смотреть (TStream and CopyFrom) or (TFileStream and LoadFromFile and SaveToFile)
 
A

Artexoid

#4
Вот функция которая как тебе нужно копирует файл побайтовом режиме:

Код:
void filecopy(AnsiString in,AnsiString out,AnsiString outext)
{
FILE * fin, *fout;
fin=fopen(in.c_str(),"rb");
fout=fopen((out+outext).c_str(),"wb");
while (!feof(fin))
{
Application->ProcessMessages();
fputc(fgetc(fin),fout);
}
fclose(fout);
fclose(fin);
ShowMessage("Копирование завершено.");
}
А вот так её лучше всего вызывать:
1.Ставишь на форме OpenDialog1 и SaveDialog1.
2.Ставишь на форму кнопку Button1.
3.В событии OnClick кнопки Button1 пишешь вот такой код.

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Form1->OpenDialog1->Execute() && Form1->SaveDialog1->Execute())
{
filecopy(Form1->OpenDialog1->FileName,Form1->SaveDialog1->FileName,ExtractFileExt(Form1->OpenDialog1->FileName));
}
}
Запускаешь прогу, нажимаешь на кнопку, она спрашивает файл который нужно скопировать и имя копии файла, расширение к копии добавляется автоматически. Вот и всё :)
 
Статус
Закрыто для дальнейших ответов.