Newsgroup: it.comp.lang.c
Titolo: aiuto creare un programma

Non ho esguito molti controlli sui dati e sull "out-of-range" degli array,
pero' se i record sono del tipo da te descritto dovrebbe quasi sempre
funzionare,se vuoi puoi aggiungere tu ulterriori controlli o variazioni:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define	SIZE_XYZ	15
#define	SIZE_BUFFER	50
#define	SIZE_DETT	sizeof( DettRec )
#define	CLEAR(a)	( memset( a, 0, sizeof (DettRec ) ) )
#define	INITDETT(a,b)	 strcpy( a->NRec,b);	\
			 a->Blank0 = ' ';	\
			 a->Blank1 = ' ';	\
			 a->Blank2 = ' ';	\
			 strcpy( a->ValoX,"0.000000");	\
			 strcpy( a->ValoY,"0.000000");	\
			 strcpy( a->ValoZ,"0.000000");	
#define	COPYDETT(a,b,c)	 memcpy( a,b,SIZE_DETT );	\
			 strcpy ( a->NRec,c )
typedef	enum	{
		OPEN_INPUT_ERROR,
		OPEN_OUTPUT_ERROR,
		OPEN_OK
		}
		RetOpen;
typedef	struct	{
		char	NRec[4];
		char	Blank0;
		char	ValoX[SIZE_XYZ];
		char	Blank1;
		char	ValoY[SIZE_XYZ];
		char	Blank2;
		char	ValoZ[SIZE_XYZ];
		}
		DettRec;
/*--------------------------------------
	Dichiarazione funzioni
---------------------------------------*/
RetOpen	OpenFiles	( char ** );
int	RepDati		( char * );
void	ParseBuff	( char * , DettRec *,DettRec * );
void	StampaOut	( DettRec * , DettRec * );
void	CloseFile	();
/*---------------------------
	Variabili globali
----------------------------*/
FILE	*HFIn	=	NULL;	/*	Handel del file di input	*/
FILE	*HFOut	=	NULL;	/*	Handel del file di output	*/
int	SectCount = 1;
void	main(int argc, char **argv)
{
	DettRec RecDett[2];
	char	BufferDati[SIZE_BUFFER];
	if	( argc != 3 )
		{
		printf( "Usage: NomeProgramma <FileInput> <FileOutput>\n" );
		exit(1);
		}
	/*	Azzera i records di dettaglio	*/	
	CLEAR( (&RecDett[0]) );
	CLEAR( (&RecDett[1]) );
	/*	Aperura files */
	if	( OpenFiles( argv ) != OPEN_OK )
		{
		printf( "Errore in apertura files\n" );
		exit( 1 );
		}
	/*	Inizializza il primo dettaglio	*/
	INITDETT( (&RecDett[0]),"1" );
	INITDETT( (&RecDett[1]),"2" );
	/*	Preleva un record dal file di input	*/
	while	( (RepDati( BufferDati )) )
		{
		/*	Copia il secondo record di dettaglio nel primo	*/
		COPYDETT( (&RecDett[0]), (&RecDett[1]), "1" );
		/*	Analizza il buffer dei dati	*/
		ParseBuff( BufferDati, &RecDett[1],&RecDett[0] );
		/*	Stampa su file di Out	*/
		StampaOut( &RecDett[0], &RecDett[1] );
		}
	CloseFile();
}
RetOpen	OpenFiles(char ** Files)
{
	if	( (HFIn = fopen( Files[1], "r+b" )) == NULL )
		return OPEN_INPUT_ERROR;
	if	( (HFOut = fopen( Files[2], "w+b" )) == NULL )
		return OPEN_OUTPUT_ERROR;
	return	OPEN_OK;
}
int	RepDati( char *BufferDati )
{
	memset	( BufferDati, 0, SIZE_BUFFER );
	/* preleva un record dal file	*/
	while	( BufferDati[ strlen( BufferDati ) - 1 ] != '\n' )
		{
		if	( !fread(&BufferDati[ strlen( BufferDati ) ],
				1,1,HFIn )
			)
			return 0;
		/*	Fa l'analisi formale del valore prelevato	*/
		if	( !atoi(&BufferDati[ strlen( BufferDati ) - 1 ]) )
			switch( BufferDati[ strlen( BufferDati ) - 1 ] )
				{
				case 'X':
				case 'Y':
				case 'Z':
				case 'R':
				case 'F':
				case 'N':
				case '-':
				case '+':
				case '.':
				case ' ':
				case '0':
				case '\n':
					break;
				default:
					printf( "Errore Nel formato del file di input\n" );
					exit( 1 );
				}
		}
	return 1;
}
 
void	ParseBuff( char *Buffer ,DettRec *RecDett, DettRec *RecDett0)
{
char	LastElem = 0;
	CLEAR( RecDett );	
	COPYDETT( RecDett, RecDett0, "2" );
	while	( *Buffer != '\n' )
		{
		switch	( LastElem )
			{
			case 'X':
				RecDett->ValoX[ strlen (RecDett->ValoX) ] =
				*Buffer;
				break;
			case 'Y':
				RecDett->ValoY[ strlen (RecDett->ValoY) ] =
				*Buffer;
				break;
			case 'Z':
				RecDett->ValoZ[ strlen (RecDett->ValoZ) ] =
				*Buffer;
				break;
			}
		switch	( *Buffer )
			{
			case 'X':
				memset( RecDett->ValoX, 0, SIZE_XYZ );
				LastElem = *Buffer;
				break;
			case 'Y':
				memset( RecDett->ValoY, 0, SIZE_XYZ );
				LastElem = *Buffer;
				break;
			case 'Z':
				memset( RecDett->ValoZ, 0, SIZE_XYZ );
				LastElem = *Buffer;
				break;
			case 'R':
			case 'F':
				LastElem = *Buffer;
			}
		Buffer++;
		}
}
 
void	StampaOut	( DettRec *RecDett0 , DettRec *RecDett1 )
{
 
	fprintf( HFOut,"\n\n begin section !%d\n",SectCount++ );
	fprintf( HFOut,"begin curve\n");
	sprintf( RecDett1->ValoX, "%f", atof( RecDett1->ValoX ) );
	sprintf( RecDett1->ValoY, "%f", atof( RecDett1->ValoY ) );
	sprintf( RecDett1->ValoZ, "%f", atof( RecDett1->ValoZ ) );
	fwrite( RecDett0, SIZE_DETT,1,HFOut );
	fprintf( HFOut,"\n");
	fwrite( RecDett1, SIZE_DETT,1,HFOut );
}
 
void	CloseFile()
{
	fclose( HFIn );
	fclose( HFOut );
}
--
Posted from 
mta04-acc.tin.it
 [212.216.176.35]
via Mailgate.ORG Server - 
http://www.mailgate.org

Una versione un po piu' funzionale:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define	SIZE_XYZ	15
#define	SIZE_BUFFER	50
#define	SIZE_DETT	sizeof( DettRec )
#define	OFF_DETT	( ((char*)&( ((DettRec*)0)->Blank0 )) -	\
			((char*)(DettRec*)0) )





/*--------------------------------------
	Dichiarazione funzioni
---------------------------------------*/

/*---------------------------
	Variabili globali
----------------------------*/

int	SectCount = 1;		/*	Contatore sezioni	*/
void	main(int argc, char **argv)
{
	DettRec RecDett[2];
	char	BufferDati[SIZE_BUFFER];
	if	( argc != 3 )
		{
		printf( "Usage: NomeProgramma <FileInput> <FileOutput>\n" );
		exit(1);
		}
	/*	Azzera i record di dettaglio	*/	
	CLEAR( (&RecDett[0]) );
	CLEAR( (&RecDett[1]) );
	/*	Apertura files */
	if	( OpenFiles( argv ) != OPEN_OK )
		{
		printf( "Errore in apertura files\n" );
		exit( 1 );
		}
	/*	Inizializza il primo dettaglio	*/
	INITDETT( (&RecDett[0]),"1" );
	INITDETT( (&RecDett[1]),"2" );
	/*	Preleva un record dal file di input	*/
	while	( (RepDati( BufferDati )) )
		{
		/*	Copia il secondo record di dettaglio nel primo	*/
		COPYDETT( (&RecDett[0]), (&RecDett[1]), "1" );
		/*	Analizza il buffer dei dati	*/
		ParseBuff( BufferDati, &RecDett[1],&RecDett[0] );
		/*	Stampa su file di Out	*/
		StampaOut( &RecDett[0], &RecDett[1] );
		}
	CloseFile();
}
RetOpen	OpenFiles(char ** Files)
{
	if	( (HFIn = fopen( Files[1], "r+b" )) == NULL )
		return OPEN_INPUT_ERROR;
	if	( (HFOut = fopen( Files[2], "w+t" )) == NULL )
		return OPEN_OUTPUT_ERROR;
	return	OPEN_OK;
}
int	RepDati( char *BufferDati )
{
	memset	( BufferDati, 0, SIZE_BUFFER );
	/* preleva un record dal file	*/
	while	( BufferDati[ strlen( BufferDati ) - 1 ] != '\n' )
		{
		if	( !fread(&BufferDati[ strlen( BufferDati ) ],
				1,1,HFIn )
			)
			return 0;
		/*	Fa l'analisi formale del valore prelevato	*/
			/*
		if	( !atoi(&BufferDati[ strlen( BufferDati ) - 1 ]) )
			switch( BufferDati[ strlen( BufferDati ) - 1 ] )
				{
				case 'X':
				case 'Y':
				case 'Z':
				case 'R':
				case 'F':
				case 'N':
				case '-':
				case '.':
				case ' ':
				case '0':
				case '\n':
					break;
				default:
					printf( "Errore Nel formato del file di input\n" );
					exit( 1 );
				}
			*/
		}
	return 1;

char	LastElem = 0;



			default:
				if	( !atoi ( Buffer ) )
					switch( *Buffer )
						{
						case '0':
						case '.':
						case '-':
						case '+':
							break;
						default:
							LastElem = *Buffer;
						}
			}
		Buffer++;
		}
}
 
void	StampaOut	( DettRec *RecDett0 , DettRec *RecDett1 )
{
 
	sprintf( RecDett1->ValoX, "%f", atof( RecDett1->ValoX ) );
	sprintf( RecDett1->ValoY, "%f", atof( RecDett1->ValoY ) );
	sprintf( RecDett1->ValoZ, "%f", atof( RecDett1->ValoZ ) );
	/*	Stampa dettaglio solo se diverso dal precedente */
 
	if	( memcmp(	((char*)RecDett0 + OFF_DETT),
				((char*)RecDett1 + OFF_DETT),
				SIZE_DETT - OFF_DETT )
		)
		{
		fprintf( HFOut,"\n\n begin section !%d\n",SectCount++ );
		fprintf( HFOut,"begin curve\n");
		fwrite( RecDett0, SIZE_DETT,1,HFOut );
		fprintf( HFOut,"\n");
		fwrite( RecDett1, SIZE_DETT,1,HFOut );
		}
}
 
void	CloseFile()
{
	fclose( HFIn );
	fclose( HFOut );
}
--
Posted from 
mta03-acc.tin.it
 [212.216.176.34]
