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