file to cpp


Автор: Александр
  В одном из проектов пришлось включать внешний файл с кодами/таблицами/картинками в программу микроконтроллера в виде массива расположенного во флешке..
last update: Ноябрь 2008



Положить внешний файл в виде массива байтов в исходник на Си.
Бывает надо для сохранения во флешке рисунков шрифтов, картинок, звуков и тп. Для этого достаточно прочитать побайтно исходный файл и записать его в текстовом виде в файл исходника.

Код..

#include <stdio.h>
#include <conio.h>
#include <string.h>
int main(int argc, char* argv[])
{
	printf("bin 2 .h converter\n");
	FILE *inpfile;
	FILE *outfile;
	unsigned char a;
	char tmpstr[256];
	unsigned int toread=0;
	unsigned int towrite=0;
	unsigned long flen=0;
	unsigned int bytecnt=0;
	//--------------------------------------------------------------------------- открыть входной файл
	inpfile = fopen(argv[1], "rb");
	if (inpfile!=NULL)
	{
		fseek(inpfile,SEEK_SET,SEEK_END);
		flen = ftell(inpfile);
		fseek(inpfile,SEEK_SET,0);
	}
	else
	{
		printf("ERROR: can't open the file: %s\n",argv[1]);
		return -1;
	}
	//--------------------------------------------------------------------------- открыть выходной файл
	outfile = fopen(argv[2], "wb");
	if (outfile!=NULL)
	{
		fseek(outfile,SEEK_SET,SEEK_END);
	}
	else
	{
		printf("ERROR: can't open the file: %s\n",argv[2]);
		fclose(inpfile);
		return -1;
	}
	//--------------------------------------------------------------------------- разбираем входной и пишем выходной
	printf("input len: %ld\n",flen);
	sprintf(tmpstr,"#include <avr/pgmspace.h>\nconst unsigned char %s PROGMEM={\n",argv[3]);
	towrite = strlen(tmpstr);
	fwrite(tmpstr, towrite, 1,outfile);				//записываем заголовок файла и имя массива
	for (bytecnt = 0; bytecnt < flen; bytecnt++)
	{
		toread = 1;									//читаем байт
		fread(&a,toread,1,inpfile);
		sprintf(tmpstr,"0x%X",a);					//выводим в шестнадцатиричном виде
		towrite = 2;
		fwrite(tmpstr, towrite, 1,outfile);			//пишем в выходной файл
		if (bytecnt < (flen - 1))
		{
			sprintf(tmpstr,",");					//запятая, если не последний байт
			towrite = strlen(tmpstr);
			fwrite(tmpstr, towrite, 1,outfile);		//
		}
		if ((bytecnt & 0x0F) == 0x0f)				//перевод строки каждые 16 байт
		{
			sprintf(tmpstr,"\n");
			towrite = strlen(tmpstr);
			fwrite(tmpstr, towrite, 1,outfile);		//
		}
	}
	sprintf(tmpstr,"\n};\n");						//закрывающая скобка
	towrite = strlen(tmpstr);
	fwrite(tmpstr, towrite, 1,outfile);				//
	fclose(outfile);
	fclose(inpfile);
	return 0;
}