Считывание файла побайтово

Тема в разделе "LANGS.C", создана пользователем rzx, 22 авг 2008.

  1. rzx

    rzx New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    7
    Привет всем!
    Народ, как лучше считать файл в определенный буфер, чтобы потом его можно было представить в шестнадцатеричном виде?
     
  2. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Выяснить размер файла, выделить буфер и прочитать. Или можно mmap'нуть. Это как больше нравится, в данной ситуации абсолютно без разницы.
     
  3. rzx

    rzx New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    7
    Я сделал через fread. Узнал размер файла, выделил буфер и вот так считывал файл...
    Код (Text):
    1. for(int i = 0; i < dwSize; i++)
    2. {
    3.   fread(&Buff[i], sizeof(BYTE), 1, File);
    4. }
    Работает, но медленно. А если еще переводить в шестнадцатеричный режим и отображать этот hex-код, то получается крайне долго.

    Подскажите, пожалуйста, как можно ускорить работу???
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Промэппируй файл, как и сказал r90
     
  5. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    rzx
    твой алгос можно ускорить примерно в 4 раза
    Если тебе нужно считать к примеру 102 байта - то нет смысла в цикле 102 раза считывать по байту.
    Можно 25 раз считать 4 байта и 1раз 2 байта (DWORD и WORD соответственно)

    ПРоще говоря, сперва считываешь двордами, а в конце считываешь вордом, байтом или и тем и другим в зависимости от остатка.

    printf, sprintf, wsprintf довольно медленные функции


    и если ты отображаешь каждый байт через них - то на больших объемах данных получится действительно крайне медлено.

    Напиши на асме свою функцию перевода числа в строку.
    А после уже всю строку выведи на экран.
     
  6. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    rzx
    Само собой. Ведь вы читаете по одному байту. Почему-бы не прочитать все сразу? И еще, наверно стоит не забыть включить бинарный режим при открытии. А с длинными файлами лучше всего мапить.
     
  7. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    Ну или по 4 байта - все равно 32-битная шина данных...

    ЗЫ. Насчет длинных файлов - вообще говоря, при размере > 1MB выделять память из heap-а не стоит, лучше - VirtualAlloc
     
  8. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Вот пример ф-ии, которая у меня когда-то давно открывала файл в hexDump-е. Там МАХ размер файла 2^32(4 Гб). Мапится ВСЕ)))) это неправильно, надо кусочками(просто я его за 15 мин написал и доделывать мне уже не надо было :) ).
    Код (Text):
    1. LRESULT
    2. HandleFileOpen(
    3.     IN PHexDumpInfo pInfo,
    4.     IN HWND         hWnd)
    5. {
    6.     OPENFILENAME ofn;
    7.     ULONG        dwFileSizeHigh;
    8.  
    9.     ZeroMemory(&ofn,sizeof(OPENFILENAME)); 
    10.  
    11.     ofn.lStructSize = sizeof(ofn); 
    12.     ofn.lpstrFilter = L"All(*.*)\0*.*\0Text(*.txt)\0*.txt\0C++ Files(*.c, *.cpp, *.h)\0*.c;*.cpp;*.h\0";    //Строка с шаблонами имен искомых файлов
    13.     ofn.hwndOwner   = hWnd;
    14.     ofn.lpstrFile   = pInfo->wszFileName;  
    15.     ofn.nMaxFile    = sizeof(pInfo->wszFileName);
    16.     ofn.Flags       = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    17.  
    18.     if(GetOpenFileName(&ofn))
    19.     {
    20.         pInfo->hFile =  CreateFile(
    21.             pInfo->wszFileName,                                      
    22.             GENERIC_READ,
    23.             FILE_SHARE_READ,//0,
    24.             NULL,
    25.             OPEN_EXISTING,                        
    26.             FILE_ATTRIBUTE_NORMAL,
    27.             NULL);
    28.  
    29.         if (pInfo->hFile == INVALID_HANDLE_VALUE)      
    30.         {
    31.             MessageBox(NULL,L"Ошибка при открытии файла!!!",L"Error",MB_OK);
    32.             return 0;
    33.         }
    34.  
    35.         pInfo->dwFileSize = GetFileSize(
    36.             pInfo->hFile,
    37.             &dwFileSizeHigh);
    38.  
    39.         if (dwFileSizeHigh > 0)
    40.         {
    41.             MessageBox(hWnd,L"Файл слишком большой!",L"Error!",0);
    42.             CloseHandle(pInfo->hFile);
    43.             pInfo->dwFileSize = 0;
    44.             return 0;
    45.         }
    46.  
    47.         pInfo->hMap = CreateFileMapping(
    48.             pInfo->hFile,
    49.             NULL,
    50.             PAGE_READONLY,
    51.             0,
    52.             pInfo->dwFileSize,
    53.             NULL);
    54.  
    55.         if (pInfo->hMap == INVALID_HANDLE_VALUE || pInfo->hMap == 0)       
    56.         {
    57.             MessageBox(NULL,L"Ошибка при открытии файла!!!",L"Error!",MB_OK);
    58.             CloseHandle(pInfo->hFile);
    59.             pInfo->dwFileSize = 0;
    60.             return 0;
    61.         }
    62.  
    63.         pInfo->fFileIsOpen = TRUE;
    64.  
    65.         pInfo->dwTotalStringAmount = pInfo->dwFileSize /16;
    66.         if ( (pInfo->dwFileSize %16) > 0)
    67.         {
    68.             pInfo->dwTotalStringAmount++;
    69.         }
    70.  
    71.         pInfo->pMappedBuffer = MapViewOfFile(
    72.             pInfo->hMap,
    73.             FILE_MAP_READ,
    74.             0,
    75.             0,
    76.             pInfo->dwFileSize);
    77.  
    78.         if (pInfo->pMappedBuffer == NULL) // это указатель () на буффер (PVOID). чтобы его  норм. вывести, надо сделать приведение к PBYTE и по i выводить
    79.         {  
    80.             MessageBox(NULL,L"Ошибка при открытии файла!!!",L"Error!",MB_OK);
    81.             CloseHandle(pInfo->hFile);
    82.             CloseHandle(pInfo->hMap);
    83.             pInfo->dwFileSize = 0;
    84.         }
    85.        
    86.         SetWindowText(hWnd,pInfo->wszFileName);
    87.         InvalidateRect(hWnd,NULL,TRUE);
    88.     }
    89.     return 0;
    90. }
    Будут вопросы - обращайтесь)
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Какая шина данных?! Чтение с диска всегда происходит секторами, если уж на то пошло, но вообще чем меньше вызовов системных функций, тем лучше. Код
    Код (Text):
    1. for(int i = 0; i < dwSize; i++)
    2. {
    3.   fread(&Buff[i], sizeof(BYTE), 1, File);
    4. }
    можно заменить на простой вызов
    Код (Text):
    1. fread(Buff, sizeof(BYTE), dwSize, File);
    Приколы с чтением по кусочкам нужны, если файл очень большой и неразумно грузить его в память сразу весь.
     
  10. z_x_spectrum

    z_x_spectrum New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    145
    Вот делал аналог BIN2DB из масма, только для синтаксиса Делфи.
    Отображатся результаты должны в RichEdit, т.к. c простым Multiline Edit большые обьемы будут сильно тормозить.

    Код (Text):
    1. procedure RawDataToPasCode(RawData, OutputData: Pointer; DataSize: Cardinal); assembler; register;
    2. const
    3. HexTable: Array[0..255] of WORD =
    4.   (
    5.     $3030, $3130, $3230, $3330, $3430, $3530, $3630, $3730, $3830, $3930,
    6.     $4130, $4230, $4330, $4430, $4530, $4630, $3031, $3131, $3231, $3331,
    7.     $3431, $3531, $3631, $3731, $3831, $3931, $4131, $4231, $4331, $4431,
    8.     $4531, $4631, $3032, $3132, $3232, $3332, $3432, $3532, $3632, $3732,
    9.     $3832, $3932, $4132, $4232, $4332, $4432, $4532, $4632, $3033, $3133,
    10.     $3233, $3333, $3433, $3533, $3633, $3733, $3833, $3933, $4133, $4233,
    11.     $4333, $4433, $4533, $4633, $3034, $3134, $3234, $3334, $3434, $3534,
    12.     $3634, $3734, $3834, $3934, $4134, $4234, $4334, $4434, $4534, $4634,
    13.     $3035, $3135, $3235, $3335, $3435, $3535, $3635, $3735, $3835, $3935,
    14.     $4135, $4235, $4335, $4435, $4535, $4635, $3036, $3136, $3236, $3336,
    15.     $3436, $3536, $3636, $3736, $3836, $3936, $4136, $4236, $4336, $4436,
    16.     $4536, $4636, $3037, $3137, $3237, $3337, $3437, $3537, $3637, $3737,
    17.     $3837, $3937, $4137, $4237, $4337, $4437, $4537, $4637, $3038, $3138,
    18.     $3238, $3338, $3438, $3538, $3638, $3738, $3838, $3938, $4138, $4238,
    19.     $4338, $4438, $4538, $4638, $3039, $3139, $3239, $3339, $3439, $3539,
    20.     $3639, $3739, $3839, $3939, $4139, $4239, $4339, $4439, $4539, $4639,
    21.     $3041, $3141, $3241, $3341, $3441, $3541, $3641, $3741, $3841, $3941,
    22.     $4141, $4241, $4341, $4441, $4541, $4641, $3042, $3142, $3242, $3342,
    23.     $3442, $3542, $3642, $3742, $3842, $3942, $4142, $4242, $4342, $4442,
    24.     $4542, $4642, $3043, $3143, $3243, $3343, $3443, $3543, $3643, $3743,
    25.     $3843, $3943, $4143, $4243, $4343, $4443, $4543, $4643, $3044, $3144,
    26.     $3244, $3344, $3444, $3544, $3644, $3744, $3844, $3944, $4144, $4244,
    27.     $4344, $4444, $4544, $4644, $3045, $3145, $3245, $3345, $3445, $3545,
    28.     $3645, $3745, $3845, $3945, $4145, $4245, $4345, $4445, $4545, $4645,
    29.     $3046, $3146, $3246, $3346, $3446, $3546, $3646, $3746, $3846, $3946,
    30.     $4146, $4246, $4346, $4446, $4546, $4646
    31.   );
    32. asm
    33.   PUSH EBX
    34.   PUSH EDI
    35.   PUSH ESI
    36.   MOV  EDI, EAX
    37.   MOV  EBX, OFFSET HexTable
    38.   MOV  ESI, 1
    39. @loop:
    40.   DEC  ESI
    41.   JNZ  @1
    42.   MOV  DWORD PTR [EDX], $20200A0D
    43.   ADD  EDX, 4
    44.   MOV  DWORD PTR [EDX], $20202020
    45.   ADD  EDX, 4
    46.   MOV  ESI, 16
    47. @1:
    48.   XOR  EAX, EAX
    49.   MOV  AL, BYTE PTR [EDI]
    50.   SHL  EAX, 1
    51.   ADD  EAX, EBX
    52.   MOV  AX, WORD PTR [EAX]
    53.   MOV  WORD PTR [EDX + 1], AX
    54.   MOV  BYTE PTR [EDX], '$'
    55.   MOV  BYTE PTR [EDX + 3], ','
    56.   ADD  EDX, 4
    57.   INC  EDI
    58.   DEC  ECX
    59.   JNZ  @loop
    60.   DEC  EDX
    61.   MOV  DWORD PTR [EDX], $20200A0D
    62.   ADD  EDX, 4
    63.   MOV  DWORD PTR [EDX], $3B292020
    64.   ADD  EDX, 4
    65.   MOV  DWORD PTR [EDX], $00000A0D
    66.   POP  ESI
    67.   POP  EDI
    68.   POP  EBX
    69. end;
    70.  
    71. procedure Proceed;
    72. var
    73. i, j, k: Cardinal;
    74. hInputFile: HFILE;
    75. hMapFile: THandle;
    76. pViewFile: Pointer;
    77. OutputBuf: Cardinal;
    78. Buf: Array[0..39] of AnsiChar;
    79.  
    80. procedure ErrExit(ErrIndex: Byte; ErrMsg: PAnsiChar);
    81. begin
    82. if ErrIndex = 0 then GlobalFree(OutputBuf);
    83. if ErrIndex in [0,4] then UnMapViewOfFile(pViewFile);
    84. if ErrIndex in [0,3,4] then CloseHandle(hMapFile);
    85. if ErrIndex in [0,2,3,4] then CloseHandle(hInputFile);
    86. SetDlgItemText(Handle, IDC_STATUSBAR, ErrMsg);
    87. if ErrIndex <> 0 then
    88.   MessageBox(Handle, ErrMsg, 'Error', MB_OK OR MB_ICONERROR);
    89. end;
    90.  
    91. begin
    92. hInputFile:=CreateFile(@FileName[0],
    93.                        GENERIC_READ,
    94.                        FILE_SHARE_READ OR FILE_SHARE_WRITE,
    95.                        nil,
    96.                        OPEN_EXISTING,
    97.                        FILE_ATTRIBUTE_NORMAL,
    98.                        0);
    99. if hInputFile = INVALID_HANDLE_VALUE then
    100.   begin
    101.   ErrExit(1, ' Can'#39't open input file.');
    102.   Exit;
    103.   end;
    104. FileSize:=GetFileSize(hInputFile, @i);
    105. if FileSize = 0 then
    106.   begin
    107.   ErrExit(2, ' File is empty.');
    108.   Exit;
    109.   end;
    110. if i <> 0 then
    111.   begin
    112.   ErrExit(2, ' File is too large.');
    113.   Exit;
    114.   end;
    115. hMapFile:=CreateFileMapping(hInputFile,
    116.                             nil,
    117.                             PAGE_READONLY,
    118.                             0,
    119.                             0,
    120.                             nil);
    121. if hMapFile = INVALID_HANDLE_VALUE then
    122.   begin
    123.   ErrExit(2, ' Can'#39't create file mapping.');
    124.   Exit;
    125.   end;
    126. pViewFile:=MapViewOfFile(hMapFile,
    127.                          FILE_MAP_READ,
    128.                          0,
    129.                          0,
    130.                          0);
    131. if pViewFile = nil then
    132.   begin
    133.   ErrExit(3, ' Can'#39't view file mapping.');
    134.   Exit;
    135.   end;
    136. OutputBuf:=GlobalAlloc(GMEM_FIXED, (FileSize shl 2) + (FileSize shr 1) + MAX_PATH + 50);
    137. if OutputBuf = 0 then
    138.   begin
    139.   ErrExit(4, ' Can'#39't get memory for processing.');
    140.   Exit;
    141.   end;
    142. //==============================================================================
    143. DWORD(Pointer(OutputBuf     )^):=$61442020;
    144. DWORD(Pointer(OutputBuf +  4)^):=$203A6174;
    145. DWORD(Pointer(OutputBuf +  8)^):=$61727241;
    146. DWORD(Pointer(OutputBuf + 12)^):=$2E305B79;
    147. Byte(Pointer(OutputBuf + 16)^):=$2E;
    148. i:=Dw2Str(FileSize - 1, Pointer(OutputBuf + 17));
    149. DWORD(Pointer(OutputBuf + 17 + i)^):=$666F205D;
    150. DWORD(Pointer(OutputBuf + 21 + i)^):=$74794220;
    151. DWORD(Pointer(OutputBuf + 25 + i)^):=$203D2065;
    152. j:=strlen(@FileName[0]);
    153. k:=j;
    154. while (j > 0) AND (FileName[j] <> '\') do dec(j);
    155. if j > 5 then
    156.   begin
    157.   DWORD(Pointer(OutputBuf + 29 + i)^):=$20202F2F;
    158.   _CopyMemory(@FileName[j + 1], Pointer(OutputBuf + 32 + i), k - j);
    159.   inc(i, k - j + 2);
    160.   end;
    161. DWORD(Pointer(OutputBuf + 29 + i)^):=$20200A0D;
    162. DWORD(Pointer(OutputBuf + 33 + i)^):=$20282020;
    163. SetWindowText(Handle, @FileName[0]);
    164. ////////
    165. RawDataToPasCode(pViewFile, Pointer(OutputBuf + i + 36), FileSize);
    166. ////////
    167. SetDlgItemText(Handle, IDC_OUTPUT, Pointer(OutputBuf));
    168. Buf[0]:=' ';
    169. i:=Dw2Str(FileSize, @Buf[1]);
    170. DWORD(Pointer(@Buf[i +  1])^):=$74796220;
    171. DWORD(Pointer(@Buf[i +  5])^):=$6C207365;
    172. DWORD(Pointer(@Buf[i +  9])^):=$6564616F;
    173. DWORD(Pointer(@Buf[i + 13])^):=$6E692064;
    174. DWORD(Pointer(@Buf[i + 17])^):=$69646520;
    175. DWORD(Pointer(@Buf[i + 21])^):=$00726F74;
    176. ErrExit(0, @Buf[0]);
    177. end;
     
  11. z_x_spectrum

    z_x_spectrum New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    145
    Есть еще такой СИшный исходнег from Veacheslav Patkov
    Код (Text):
    1. /*
    2.  *  binary to xxx converter
    3.  *
    4.  *  Copyright (c) 2007-2008, Veacheslav Patkov.
    5.  *  aLL rights reserved.
    6.  *
    7.  */
    8.  
    9. #include <stdio.h>
    10. #include <stdlib.h>
    11. #include <string.h>
    12. #include <stdarg.h>
    13.  
    14. #define BIN2XXX_VERSION "0.06"
    15.  
    16. char erropt[5],oname[256],ident[256] = "ident";
    17.  
    18. void error(char *format, ...)
    19. {
    20.     va_list ap;
    21.  
    22.     fprintf(stderr,"bin2xxx: error: ");
    23.     va_start(ap,format);
    24.     vfprintf(stderr,format,ap);
    25.     va_end(ap);
    26.     fprintf(stderr,"\n");
    27.     exit(1);
    28. }
    29.  
    30. int incomp_opt(int opt)
    31. {
    32.     static int i = 0;
    33.     if (opt && !strchr(erropt,opt))
    34.         erropt[i++] = opt;
    35.     return i;
    36. }
    37.  
    38. int main(int argc, char **argv)
    39. {
    40.     int c;
    41.     unsigned char format = 0, op_cmt = 0, op_dec = 0, op_esch = 0;
    42.     unsigned char op_esco = 0, op_esco3 = 0;
    43.     unsigned int align = 10, i, offset, start = 0;
    44.     unsigned int end = (unsigned int)-1, size = end;
    45.     FILE *fi, *fo;
    46.  
    47.     if (argc == 1) {
    48.         printf("bin2xxx - binary to xxx converter version " BIN2XXX_VERSION "\n"
    49.                "usage: bin2xxx <format> [options] [file]\n"
    50.                "formats:\n"
    51.                "  c          c/c++\n"
    52.                "  n          nasm/yasm\n"
    53.                "  m          masm/tasm/fasm\n"
    54.                "  g          gnu assembler\n"
    55.                "  p          pascal\n"
    56.                "  a          ascii text\n"
    57.                "options:\n"
    58.                " -c          comment current file offset at each line\n"
    59.                " -d          write bytes as decimal number, default: hexademical\n"
    60.                " -a <align>  align to <align>, default: 10\n"
    61.                " -i <ident>  identifier is <ident>, default: `ident'\n"
    62.                " -r <n[-m]>  convert bytes from file offset <n> [to <m>] (hex)\n"
    63.                " -o <file>   save output to <file>, default: stdout\n"
    64.                " -h          c: write bytes as hex esc-codes in string\n"
    65.                " -t          c: write bytes as oct esc-codes in string\n"
    66.                " -T          c: write bytes as oct esc-codes in string (3 digit)\n"
    67.                "example:\n"
    68.                "  bin2xxx c -r 2e0-3ff -cd -a 16 -i sample -o oname.h iname.exe\n");
    69.         return 0;
    70.     }
    71.  
    72.     argv++;
    73.     argc--;
    74.     if (strlen(*argv) != 1 || ((format = **argv) != 'c' && format != 'n' &&
    75.         format != 'm' && format != 'g' && format != 'p' && format != 'a'))
    76.         error("unrecognized format: %s",*argv);
    77.  
    78.   parse_opt:
    79.     while (--argc > 0 && **++argv == '-')
    80.         while ((c = *++*argv) != 0)
    81.             switch (c) {
    82.                 case 'c':
    83.                     op_cmt = 1;
    84.                     break;
    85.                 case 'd':
    86.                     op_dec = 1;
    87.                     incomp_opt(c);
    88.                     break;
    89.                 case 'h':
    90.                     op_esch = 1;
    91.                     incomp_opt(c);
    92.                     break;
    93.                 case 't':
    94.                     op_esco = 1;
    95.                     incomp_opt(c);
    96.                     break;
    97.                 case 'T':
    98.                     op_esco3 = 1;
    99.                     incomp_opt(c);
    100.                     break;
    101.                 case 'a':
    102.                 case 'i':
    103.                 case 'r':
    104.                 case 'o':
    105.                     argc--;
    106.                     if (!argc)
    107.                         error("no argument for `-%c' option",c);
    108.                     argv++;
    109.                     switch (c) {
    110.                         case 'a':
    111.                             align = (unsigned int)strtoul(*argv,0,10);
    112.                             if (align < 1 || align > 100)
    113.                                 error("incorrect argument for `-%c' option: %s",c,*argv);
    114.                             goto parse_opt;
    115.                         case 'i':
    116.                             strcpy(ident,*argv);
    117.                             goto parse_opt;
    118.                         case 'o':
    119.                             strcpy(oname,*argv);
    120.                             goto parse_opt;
    121.                         case 'r':
    122.                             if (sscanf(*argv,"%x-%x",&start,&end) != 2 &&
    123.                                 sscanf(*argv,"%x",&start) != 1)
    124.                                 error("incorrect argument for `-%c' option: %s",c,*argv);
    125.                             goto parse_opt;
    126.                     }
    127.                 default:
    128.                     error("unrecognized option: -%c",c);
    129.             }
    130.  
    131.     if (incomp_opt(0) >= 2)
    132.         error("incompatible options: -%s",erropt);
    133.  
    134.     if (!argc)
    135.         fi = stdin;
    136.     else if (!(fi = fopen(*argv,"rb")))
    137.         error("cannot open file `%s'",*argv);
    138.  
    139.     if (!oname[0])
    140.         fo = stdout;
    141.     else if (!(fo = fopen(oname,"wb")))
    142.         error("cannot open file `%s'",oname);
    143.  
    144.     if (fi != stdin) {
    145.         fseek(fi,0,SEEK_END);
    146.         size = ftell(fi) - 1;
    147.         size = size > end ? end : size;
    148.         fseek(fi,start,SEEK_SET);
    149.     } else if (start)
    150.         error("option `-r' is not allowed to stdin");
    151.  
    152.     switch (format) {
    153.         case 'c':
    154.             if (op_esch || op_esco || op_esco3)
    155.                 fprintf(fo,"unsigned char %s[] =\n  \"",ident);
    156.             else
    157.                 fprintf(fo,"unsigned char %s[] = {\n  ",ident);
    158.             break;
    159.         case 'n':
    160.         case 'm':
    161.             fprintf(fo,"%s\tdb ",ident);
    162.             break;
    163.         case 'g':
    164.             fprintf(fo,"%s:\t.byte ",ident);
    165.             break;
    166.         case 'p':
    167.             fprintf(fo,"%s: array[0..%u] of byte = (\n  ",
    168.             ident, fi == stdin ? 0: size-start);
    169.         case 'a':
    170.             break;
    171.     }
    172.  
    173.     for (i = 0, offset = start; (c = fgetc(fi)) != EOF && offset <= end; i++, offset++) {
    174.         switch (format) {
    175.             case 'c':
    176.                 if (!(i % align) && i) {
    177.                     if (op_esch || op_esco || op_esco3) {
    178.                         if (op_cmt)
    179.                             fprintf(fo,"\"  /* 0x%08x */\n  \"",offset-align);
    180.                         else
    181.                             fprintf(fo,"\"\n  \"");
    182.                     }
    183.                     else {
    184.                         if (op_cmt)
    185.                             fprintf(fo," /* 0x%08x */\n  ",offset-align);
    186.                         else
    187.                             fprintf(fo,"\n  ");
    188.                     }
    189.                 }
    190.                 if (op_esch)
    191.                     fprintf(fo,"\\x%02x",c);
    192.                 else if (op_esco)
    193.                     fprintf(fo,"\\%o",c);
    194.                 else if (op_esco3)
    195.                     fprintf(fo,"\\%03o",c);
    196.                 else if (op_dec)
    197.                     fprintf(fo,"%3u",c);
    198.                 else
    199.                     fprintf(fo,"0x%02x",c);
    200.                 if (offset != size && !op_esch && !op_esco && !op_esco3) fprintf(fo,",");
    201.                 break;
    202.             case 'n':
    203.                 if (!(i % align) && i) {
    204.                     if (op_cmt)
    205.                         fprintf(fo,"  ; 0x%08x\n\tdb ",offset-align);
    206.                     else
    207.                         fprintf(fo,"\n\tdb ");
    208.                 }
    209.                 if (op_dec)
    210.                     fprintf(fo,"%3u",c);
    211.                 else
    212.                     fprintf(fo,"0x%02x",c);
    213.                 if (((i+1) % align) && offset != size) fprintf(fo,",");
    214.                 break;
    215.             case 'm':
    216.                 if (!(i % align) && i) {
    217.                     if (op_cmt)
    218.                         fprintf(fo,"  ; 0x%08x\n\tdb ",offset-align);
    219.                     else
    220.                         fprintf(fo,"\n\tdb ");
    221.                 }
    222.                 if (op_dec)
    223.                     fprintf(fo,"%3u",c);
    224.                 else
    225.                     fprintf(fo,"%03xh",c);
    226.                 if (((i+1) % align) && offset != size) fprintf(fo,",");
    227.                 break;
    228.             case 'g':
    229.                 if (!(i % align) && i) {
    230.                     if (op_cmt)
    231.                         fprintf(fo,"  /* 0x%08x */\n\t.byte ",offset-align);
    232.                     else
    233.                         fprintf(fo,"\n\t.byte ");
    234.                 }
    235.                 if (op_dec)
    236.                     fprintf(fo,"%3u",c);
    237.                 else
    238.                     fprintf(fo,"0x%02x",c);
    239.                 if (((i+1) % align) && offset != size) fprintf(fo,",");
    240.                 break;
    241.             case 'p':
    242.                 if (!(i % align) && i) {
    243.                     if (op_cmt)
    244.                         fprintf(fo," { 0x%08x }\n  ",offset-align);
    245.                     else
    246.                         fprintf(fo,"\n  ");
    247.                 }
    248.                 if (op_dec)
    249.                     fprintf(fo,"%3u",c);
    250.                 else
    251.                     fprintf(fo,"$%02x",c);
    252.                 if (offset != size) fprintf(fo,",");
    253.                 break;
    254.             case 'a':
    255.                 if (!(i % align) && i) {
    256.                     if (op_cmt)
    257.                         fprintf(fo,"  ; 0x%08x\n",offset-align);
    258.                     else
    259.                         fprintf(fo,"\n");
    260.                 }
    261.                 if (op_dec)
    262.                     fprintf(fo,"%3u",c);
    263.                 else
    264.                     fprintf(fo,"%02x",c);
    265.                 if (offset != size) fprintf(fo," ");
    266.                 break;
    267.         }
    268.     }
    269.  
    270.     switch (format) {
    271.         case 'c':
    272.             if (op_esch || op_esco || op_esco3) fprintf(fo,"\";\n");
    273.             else fprintf(fo,"\n};\n");
    274.             break;
    275.         case 'n':
    276.         case 'm':
    277.         case 'g':
    278.             fprintf(fo,"\n");
    279.             break;
    280.         case 'p':
    281.             fprintf(fo,"\n);\n");
    282.         case 'a':
    283.             break;
    284.     }
    285.  
    286.     fclose(fi);
    287.     fclose(fo);
    288.     return 0;
    289. }
    Но меня что-то берут сомнения в его эффективности...
     
  12. rzx

    rzx New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    7
    Всем большое спасибо!
    Задачка решена!
     
  13. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    diamond
    Какая шина данных?! Чтение с диска всегда происходит секторами

    Да уж, ступил, sorry... Видимо, надо было уже ложиться спать :)
     
  14. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    _basmp_
    А с реально длинными (3+ гига) файлами пожалуй лучше не мапить.

    diamond
    Накопители в последнее время становятся всё более разными. Не уверен, что на флэш-драйвах физически существуют сектора. Даже так: уверен, что НЕ существуют.
     
  15. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    CyberManiac
    По моим сведениям, хотя физически на флэшках секторов и нет, но в программном интерфейсе всё равно чтение/запись осуществляется целыми секторами (512 байт). Поправьте, если заблуждаюсь.
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Какая разница - есть сектора, нет секторов ;) Главное, что скорость чтения\записи как HDD, так и USB флэшек оставляет желать лучшего. Поэтому ОС с девайса ес-но по одному символу не читает, а юзает упреждающее чтение данных в режиме ДМА в системный кэш большими блоками (в винде до 64К). Поэтому при чтении данных малыми порциями время в основном тратится на сами вызовы ReadFile и поэтому ес-но лучше за раз читать побольше и пореже (для уменьшения накладных расходов на ReadFile достаточно юзать буфер размером до 4-8К)
    PS: В сишном стриме вроде как есть собственный буфер чтения\записи, размер которого можно изменить через setbuf\setvbuf