link5382 link5383 link5384 link5385 link5386 link5387 link5388 link5389 link5390 link5391 link5392 link5393 link5394 link5395 link5396 link5397 link5398 link5399 link5400 link5401 link5402 link5403 link5404 link5405 link5406 link5407 link5408 link5409 link5410 link5411 link5412 link5413 link5414 link5415 link5416 link5417 link5418 link5419 link5420 link5421 link5422 link5423 link5424 link5425 link5426 link5427 link5428 link5429 link5430 link5431 link5432 link5433 link5434 link5435 link5436 link5437 link5438 link5439 link5440 link5441 link5442 link5443 link5444 link5445 link5446 link5447 link5448 link5449 link5450 link5451 link5452 link5453 link5454 link5455 link5456 link5457 link5458 link5459 link5460 link5461 link5462 link5463 link5464 link5465 link5466 link5467 link5468 link5469 link5470 link5471 link5472 link5473 link5474 link5475 link5476 link5477 link5478 link5479 link5480 link5481 link5482 link5483 link5484 link5485 link5486 link5487 link5488 link5489 link5490 link5491 link5492 link5493 link5494 link5495 link5496 link5497 link5498 link5499 link5500 link5501 link5502 link5503 link5504 link5505 link5506 link5507 link5508 link5509 link5510 link5511 link5512 link5513 link5514 link5515 link5516 link5517 link5518 link5519

Форум — Ответы     (  К темам )
 ?  Алексей: Как открывать файлы в двоичном режиме (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" можешь удалить :)