Не все файлы получается прочитать побайтно - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Захотелось реализовать программу, hex-редактор. Но вот проблема, не все файлы получается прочитать по байтно...
FILE *fout,*finp,*ftext;
    FILE *fp;
    //input
    if((fp = fopen("1.jpg", "rb")) == NULL)
    {
        printf("Error input file\n");
        return 1;
    }
    //output
    fout=fopen("test.jpg","w+b");
    //test text file
    ftext=fopen("text.txt","w+b");
    char c;
 
    while (((с=getc(finp))!=EOF)
    {
        putc(c,ftext);
        putc(c,fout);
    }
 
    fclose(fp);
    fclose(fout);
    fclose(ftext);
    return 0;
Естественно, картинки и другие файлы не удается разобрать по байтам, а вот текстовые очень хорошо читаются. Есть ли альтернативные функции на языке Си способные на разбиение файлов на байты?

Решение задачи: «Не все файлы получается прочитать побайтно»

textual
Листинг программы
   // Open Source File
   HANDLE hFile = CreateFile
   (
      argv[1],                      // pointer to name of the file
      GENERIC_READ,                 // access (read-write) mode
      FILE_SHARE_READ,              // share mode
      NULL,                         // pointer to security attributes
      OPEN_ALWAYS,                  // how to create
      FILE_ATTRIBUTE_NORMAL,        // file attributes
      NULL                          // handle to file with attributes to copy
   );
 
   if (hFile == INVALID_HANDLE_VALUE)
   {
      Error();
      return -1;
   }
 
   // Get File Size
   // Really FileSizeHi always ignored !
   DWORD dwSizeHi = 0;
   DWORD dwSizeLo = GetFileSize(hFile,&dwSizeHi);
 
   // Map to Memory
   HANDLE hMapFile = CreateFileMapping
   (
      hFile,            // handle to file to map
      NULL,             // optional security attributes
      PAGE_READONLY,    // protection for mapping object
      dwSizeHi,         // high-order 32 bits of object size
      dwSizeLo,         // low-order 32 bits of object size
      NULL              // name of file-mapping object
   );
 
   if (!hMapFile)
   {
      Error();
      return -1;
   }
 
   LPVOID pView =  MapViewOfFile
   (
      hMapFile,         // file-mapping object to map into address space
      FILE_MAP_READ,    // access mode
      0,                // high-order 32 bits of file offset
      0,                // low-order 32 bits of file offset
      0                 // number of bytes to map
   );
 
   DWORD    dwStart = 0;
   DWORD    dwEnd   = dwSizeLo;
 
   if (argc >= 3)
   {
      sscanf(argv[2],"%x",&dwStart);
   }
 
   if (argc == 4)
   {
      sscanf(argv[3],"%x",&dwEnd);
   }
 
   // Do Actual Work
   const int   BLOCK_SIZE = 0x10;     // One Line
 
   BYTE*    pBuf  = (BYTE*)pView;
   DWORD    dwOfs = dwStart;
 
   printf("\nHD 1.0 :  HexDump for file '%s' [%08X:%08X]\n\n",argv[1],dwStart,dwEnd);
 
   if (dwStart <= (dwEnd - BLOCK_SIZE))
   {
      do
      {
         printf("%08X: ",dwOfs);
 
         for (short i = 0; i < BLOCK_SIZE; ++i)
         {
            printf(" %02X",pBuf[dwOfs + i]);
         }
         
         printf("  ");
 
         for (short i = 0; i < BLOCK_SIZE; ++i)
         {
            BYTE     byChr = pBuf[dwOfs + i];
 
            printf("%c",IsPrintable(byChr)  ?  byChr  :  '.');
         }
 
         printf("\n");
 
         dwOfs += BLOCK_SIZE;
      } 
      while (dwOfs < (dwEnd - BLOCK_SIZE));
   }
 
   if (dwOfs < dwEnd)      // Rest of File
   {
      short    iCnt  = (short)(dwEnd - dwOfs);
      short    iRest = BLOCK_SIZE - iCnt;
 
      printf("%08X: ",dwOfs);
 
      for (short i = 0; i < iCnt; ++i)
      {
         printf(" %02X",pBuf[dwOfs + i]);
      }
 
      for (short i = 0; i < iRest; ++i)
      {
         printf("   ");
      }
 
      printf("  ");
 
      for (int i = 0; i < iCnt; ++i)
      {
         BYTE     byChr = pBuf[dwOfs + i];
 
         printf("%c",IsPrintable(byChr)  ?  byChr  :  '.');
      }
 
      for (int i = 0; i < iRest; ++i)
      {
         printf(" ");
      }
 
      printf("\n");
   }
 
   // Cleanup
   if (!UnmapViewOfFile(pView))
   {
      return -1;
   }
 
   if (!CloseHandle(hMapFile))
   {
      return -1;
   }
 
   if (!CloseHandle(hFile))
   {
      return -1;
   }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы