Не все файлы получается прочитать побайтно - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д