Ver Mensaje Individual
  #6 (permalink)  
Antiguo 31/03/2008, 01:12
Germancho7186
 
Fecha de Ingreso: marzo-2008
Mensajes: 22
Antigüedad: 16 años, 8 meses
Puntos: 1
Re: [B]poner espacios en un vector[/B]

Código:
// Espero que esto te sea lo que buscas.
// Bueno, aquí esta el nuevo código
// Lo que hace es leer línea por línea de un archivo, y buscar los parantesis,
// si encuentra un inicio de parantesis, inserta un espacio si es que antes no hay uno,
// si encuentra un final de parantesis, inserta un espacio después, si es que no hay,
// o si este parentesis el NO es el último caracter de la línea.
// El archivo modificado se guardar bajo un nuevo nombre (filename + ".new").
// Ajuste la function StrInsertText ya que tenía un pequeño bug.
///////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <conio.h>
#include <string.h>

void StrInsertText(char *dst, char *src)
{
	long len;
	
	len = strlen(src);
	if(len)
	{
		char *end = dst + strlen(dst);
		char *aux01 = end;
		char *aux02 = end + strlen(src);
		
		while(aux02 > dst)
			*aux02-- = *aux01--;
	}
	len = strlen(src);
	if(len)
	{
		memcpy(dst, src, len);
	}
}
void analize(char *filename)
{
	FILE *pfSrc;
	FILE *pfDst;
	char filenamenew[250];
	
	pfSrc = fopen(filename, "r");
	strcpy(filenamenew, filename);
	strcat(filenamenew, ".new");
	pfDst = fopen(filenamenew, "w");
	
	if(pfSrc == NULL)				// Si el archivo de origen es igual a NULL
	{
		printf("No se pudo abrir el archivo: \"%s\"", filename);
	}
	else if(pfDst != NULL)			// Si el archivo de destino es diferente NULL (por supuesto que el archivo de origen tambien)
	{
		char *p;
		char sz[250];
		
		while(!feof(pfSrc))
		{
//			fgets(sz, 250, pfSrc);					// Esto no es recomendable
			if(fgets(sz, 250, pfSrc))				// Siempre es necesario comprobar si la función tubo éxito
													// De lo contrario, cuando se llega al final del archivo, se estaría analizando la línea anterior
			{
				for(p = sz; *p != '\n'; p++)
				{
					
					if(*p == '(' && ((p != sz) && *(p - 1) != ' '))				// Inserta un espacio antes del paréntesis si es que no lo hay
						StrInsertText(p++, " ");
//					else if(*p == ')' && *(p + 1) != ' ')						// Inserta un espacia despues del paréntesis si es que no lo hay
					else if(*p == ')' && *(p + 1) != ' ' && *(p + 1) != '\n')	// Inserta un espacia despues del paréntesis si es que no lo hay, y si no es el último caracter de la línea
						StrInsertText(++p, " ");
				}
				fputs(sz, pfDst);
			}
		}
		printf("Ok\n");
	}
	if(pfSrc)
		fclose(pfSrc);
	if(pfDst)
		fclose(pfDst);
}
void main(int argc, char *argv[])
{
	long i;
	
	if(argc > 1)			// Si hay argumentos
	{
		for(i = 1; i < argc; i++)
		{
			analize(argv[i]);
		}
	}
	else					// Si no hay argumentos, utilizar un archivo predefinido
	{
		analize("test.txt");
	}
	getch();
}
// Lo probé y me funciona, pero no sé si es lo que buscas.

/* Ejemplo:
------------------------------------------------------------

// Antes:
((((texto_01))(texto_02)()))
(()()((texto_01)(texto_02))())

// Después:
( ( ( (texto_01) ) (texto_02) () ) )
( () () ( (texto_01) (texto_02) ) () )

*/