Форум — Ответы     (  К темам )
 ?  Алексей: Как открывать файлы в двоичном режиме (25-01-2003 23:42:48)
Как открывать файлы в двоичном режиме и считывать байты?(С++BUILDER)
 Георгий (26-01-2003 06:11:27)
посмотри описание обьекта fstream — у него можно указать тип доступа к файлам как двоичный.
Если хочешь хорошую скорость доступа (чтение/запись) то смотри Win32 API: CreateFile, ReadFile, WriteFile, CloseHandle...
 Павел (26-01-2003 20:00:49)
Похожий вопрос был.

Ответ:( 2002-11-21 18:35:31 ) Владимир support@cbuilder.ru http://cbuilder.ru
// у нас есть данные разных типов

int countValut;
char codeRubli[5];
double Rubli[2][2];

struct Valuta {
char CodeValut[5];
char NameValut[15];
double kursCB;
double kurs[2][2];
int kas[2][2];
int sum[2][2];
} ones;

Valuta val[20];

// создаем файл и записываем в него данные этих разных типов:
// char, int, double и struct
int ih;
ih = FileCreate(“myFile.bin”);
FileWrite(ih,(char*)&countValut,sizeof(countValut));
FileWrite(ih,(char*)codeRubli,sizeof(codeRubli));
FileWrite(ih,(char*)Rubli,sizeof(Rubli));
for(int i=0; i<20; i++) FileWrite(ih,(char*)&val[i],sizeof(ones));
FileClose(ih);

// когда нужно, можем прочесть это все из этого файла

int ih;
if((ih = FileOpen(“myFile.bin”,fmOpenRead))!= -1){
FileRead(ih,(char*)&countValut,sizeof(countValut));
FileRead(ih,(char*)codeRubli,sizeof(codeRubli));
FileRead(ih,(char*)Rubli,sizeof(Rubli));
for(int i=0; i<20; i++) {
FileRead(ih,(char*)&ones,sizeof(ones)); val[i] = ones;
}
FileClose(ih);
} else ShowMessage(“Ошибка открытия файла.”);

// есть и другие способы — через другие функции
// что именно интересует — спрашивайте...
 Zubr (21-03-2003 08:59:33)
Со всем уважением к Георгию и Павлу, они очень много и потеме отвечают в форуме...
Есть такой вариант программы. Мне нужно извлечь только часть файла, держи сырец без проблем компилится в Unix/Linux (писалось именно под них), Windows и как раз по твоей теме.



// Cut.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

#define MEGOBYTE 1048576

void PrintIllegal(char *str = "")
{
if (str != "")
printf("%s\n", str);
printf("Usage: Cut.exe <SrcFile> <DestFile> [/B:Size[B|K|M]] [/[E|S]:Size[B|K|M]] [/O]\n");
printf("Prefix:\n");
printf("\t/B:Size — initial position in source file for cut;\n");
printf("\t/E:Size — final position in source file for cut\n");
printf("\t\tor\n");
printf("\t/S:Size — block size in source file for cut.\n");
printf("Suffix:\n");
printf("\tB — size in bytes;\n");
printf("\tK — size in kilobytes;\n");
printf("\tM — size in megabytes;\n\n");
printf("Example: Cut.exe Src.fnm Dest.fnm /B:100 /E:200 /O\n");
}

int main(int argc, char* argv[])
{
FILE *Src, *Dest;
bool Overwrite;
printf("File cuter version 2.0\n");
printf("\n\n");
if (argc > 2) {
char *Params;
char *SrcFName, *DestFName;
long FileSize, CutSize, BegSize;
int i,j;

j = argc — 3;

int ParamLen = 0;

if (j>0) {
for (i=0;i<j;i++)
if (ParamLen<strlen(argv[i+3])+1)
ParamLen=strlen(argv[i+3])+1;
Params = new char[ParamLen];
}

SrcFName = new char[strlen(argv[1])+1];
strcpy(SrcFName, argv[1]);
DestFName = new char[strlen(argv[2])+1];
strcpy(DestFName, argv[2]);
Overwrite = false;

BegSize=0;
Src=fopen(SrcFName, "rb");
if (Src == NULL) {
printf("Can't open source file: %s\n", SrcFName);
return 0; }

fseek(Src,0,SEEK_END);
FileSize=CutSize=ftell(Src);


bool IsEnd;
IsEnd = false;

char Last;
unsigned CSize;
char Pref[4];
unsigned k;

if (j>0)
for (i=0; i<j; i++) {
strcpy(Params, argv[i+3]);

for (k=0; k<strlen(Params); k++)
Params[k]=toupper(Params[k]);
Last = 0;

sscanf(Params, "%3s%d%c", &Pref, &CSize, &Last);

if (Last != 'B' && Last != 'M' && Last != 'K' && Last != 0) {
PrintIllegal("Incorrect parameters !");
return 0; }

if (Last == 'M')
CSize*=MEGOBYTE;
if (Last == 'K')
CSize*=1024;

if (strcmp("/O", Pref) == 0) {
Overwrite = true;
}
else
if (strcmp("/B:", Pref) == 0) {
if (CSize<FileSize) {
BegSize=CSize;
CutSize=FileSize-BegSize; }
else {
PrintIllegal("The initial position is more than length of a file !");
return 0;
}
}
else
if (strcmp("/E:", Pref) == 0) {
if (!IsEnd) {
IsEnd = true;
if (CSize<=FileSize)
CutSize=CSize-BegSize;
else {
PrintIllegal("Incorrect source file size !");
return 0;
}
}
else {
PrintIllegal("The final position of a file is already defined !");
return 0;
}
}
else
if (strcmp("/S:", Pref) == 0) {
if (!IsEnd) {
IsEnd = true;
if (CSize+BegSize<=FileSize)
CutSize=CSize;
else {
PrintIllegal("Incorrect source file size !");
return 0;
}
}
else {
PrintIllegal("The final position of a file is already defined !");
return 0;
}
}
else {
PrintIllegal("Incorrect parameters!");
return 0; }
}

Dest=fopen(DestFName, "rb");
if (Dest != NULL) {
if (!Overwrite) {
printf("File: %s already exists. Overwrite (Y/N)?", DestFName);
char IsNo;
IsNo = 'N';
scanf("%c", &IsNo);
IsNo = toupper(IsNo);
if (IsNo == 'N')
return 0;
printf("\n");
}
fclose(Dest);
}

Dest=fopen(DestFName, "wb");
if (Dest == NULL) {
printf("Cant't create destination file: %s\n", DestFName);
fclose(Src);
return 0;
}

printf("Source file: \n\t%s with size %i\n", SrcFName, FileSize);
printf("Destination file: \n\t%s from position %i and size %i \n", DestFName, BegSize, CutSize);

fseek(Src, BegSize, SEEK_SET);

long MemUsage;

if (CutSize < MEGOBYTE) {
MemUsage = CutSize; }
else {
MemUsage = MEGOBYTE; }

char *Mem;
Mem = (char *)calloc(MemUsage, sizeof(char));

while (CutSize != 0) {
if (CutSize < MEGOBYTE) {
fread(Mem, CutSize, 1, Src);
fwrite(Mem, CutSize, 1, Dest);
CutSize=0;}
else {
fread(Mem, MEGOBYTE, 1, Src);
fwrite(Mem, MEGOBYTE, 1, Dest);
CutSize-=MEGOBYTE; }
}

free(Mem);
fclose(Dest);
fclose(Src);
printf("\n"); }
else {
PrintIllegal(); }
return 0;
}
 Zubr (21-03-2003 09:04:56)
Ах да...
#include "stdafx.h" можешь удалить :)