#include <iostream.h>
#include <stdio.h>
#include <string.h>

#define ERR_MSG "\nError: "
#define WARN_MSG "\nWarning: "
#define BUF_SIZE 2048
#define HEADER_LEN_INT 4
#define HEADER_LEN_BYTE 0


int transferByte(FILE *out, char *picfile, int cl_no, float normVal = 255)
{

	char buf[BUF_SIZE];
	FILE *in;

	int bytes = 0;
	int dataIn, i;
	float dataOut;


	if ((in = fopen(picfile, "rt"))
		    == NULL)
	{
	   cout << ERR_MSG << "Cannot open " << picfile << " !!!\n";
	   return -1;
	}


	// ignore header
	for(i=0;i<HEADER_LEN_BYTE;i++)
		fgets(buf,BUF_SIZE, in);

	do
	{
	   dataIn = fgetc(in);
	   cout << " " << dataIn;
	   if (dataIn != -1)
	   {
	      dataOut = (float)dataIn / normVal;
	      fprintf(out, "%.3f ", dataOut);
	      if (bytes>0 && (bytes % 15 == 0))  fprintf(out, "\n");
	      bytes++;
	   }
	}
	while (!feof(in));



	fprintf(out, " : %i;\n", cl_no);

	fclose(in);
	cout << "\n\n" << bytes << " Bytes read from file!";
	return bytes;
}


int transferInt(FILE *out, char *picfile, int cl_no, float normVal = 255)
{

	char buf[BUF_SIZE];
	FILE *in;

	int bytes = 0;
	int dataIn, i;
	float inVal, dataOut;


	if ((in = fopen(picfile, "rt"))
		    == NULL)
	{
	   cout << ERR_MSG << "Cannot open " << picfile << " !!!\n";
	   return -1;
	}


	// ignore header
	for(i=0;i<HEADER_LEN_INT;i++)
		fgets(buf,BUF_SIZE, in);

	do
	{
	   dataIn = fscanf(in, "%f", &inVal);

	   if (dataIn > 0)
	   {
	      dataOut = inVal / normVal;
	      fprintf(out, "%.1f ", dataOut);
	      if (bytes>0 && (bytes % 15 == 0))  fprintf(out, "\n");
	      bytes++;
	   }

	}
	while (!feof(in));

	fprintf(out, " : %i;\n", cl_no);

	fclose(in);
	cout << "\n\n" << bytes << " Bytes read from file!";
	return bytes;
}


int Intfiles2dat(char *pic_file_list, char *dat_file)
{
	char buf[BUF_SIZE];
	char filename[BUF_SIZE];
	FILE *in, *out;
	int ok, class_no, picfiles = 0;


	if ((in = fopen(pic_file_list, "rt"))
		    == NULL)
	{
	   cout << ERR_MSG << "Cannot open " << pic_file_list << " !!!\n";
	   return -1;
	}

	if ((out = fopen(dat_file, "wt"))
		    == NULL)
	{
	   cout << ERR_MSG << "Cannot open " << dat_file << " !!!\n";
	   return -1;
	}


	do
	{
	   strcpy(buf, "");
	   fgets(buf,BUF_SIZE, in);

	   ok = sscanf(buf, "%s%i\n", filename, &class_no);

	   if (ok == 2)
	   {
	      cout << "\n load: " << filename
		   << " len: " << transferInt(out, filename, class_no);
	      picfiles++;
	   }

	}
	while (!feof(in));

	fclose(out);
	fclose(in);
	cout << "\n\n" << picfiles << " files read!";
	return picfiles;
}


int Bytefiles2dat(char *pic_file_list, char *dat_file)
{
	char buf[BUF_SIZE];
	char filename[BUF_SIZE];
	FILE *in, *out;
	int ok, class_no, picfiles = 0;


	if ((in = fopen(pic_file_list, "rt"))
		    == NULL)
	{
	   cout << ERR_MSG << "Cannot open " << pic_file_list << " !!!\n";
	   return -1;
	}

	if ((out = fopen(dat_file, "wt"))
		    == NULL)
	{
	   cout << ERR_MSG << "Cannot open " << dat_file << " !!!\n";
	   return -1;
	}


	do
	{
	   strcpy(buf, "");
	   fgets(buf,BUF_SIZE, in);

	   ok = sscanf(buf, "%s%i\n", filename, &class_no);

	   if (ok == 2)
	   {
		   cout << "\n load: " << filename << " len: "
			<< transferByte(out, filename, class_no);
		   picfiles++;
	   }

	}
	while (!feof(in));

	fclose(out);
	fclose(in);
	cout << "\n\n" << picfiles << " files read!";
	return picfiles;
}


int main()
{
	char in_file[30], out_file[30], t[10];


	cout << "\nin file: ";
	cin >> in_file;

	cout << "\nBIN-out file: ";
	cin >> out_file;


	cout << "\nInput file type [b]yte / [i]nt ? ";
	cin >> t;

	if (t[0] == 'b') Bytefiles2dat(in_file, out_file);
	if (t[0] == 'i') Intfiles2dat(in_file, out_file);

	return 0;
}
