Не все файлы получается прочитать побайтно - 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;
}