/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Invertir palabras (no es el clasico)

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
hongee



Registrado: 16 Nov 2013
Mensajes: 27

MensajePublicado: 20/03/2014 6:38 am
Título: Invertir palabras (no es el clasico)

Buenas tanto tiempo..
Bueno tengo que scribir un programa para invertir el orden de las palabras que contiene un archivo de texto cualquiera.

Ejemplo: "afuera está lloviendo" –> "lloviendo está afuera"

El programa me devuelve lo siguiente odneivoll esta afuera.

Código:

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

#pragma warning (disable: 4996)

int invertir_lineas ();
void inverso(char *cad);
void inv (char *inicio, char *fin);

int main()
{
   int r;
    r=invertir_lineas ();
   if (r==1)
   {
      return 1;
   }
   system ("pause");
}


int invertir_lineas ()
{
   FILE *ori,*dest;
     char cad[80];

   ori=fopen("D:/origen.txt","rt");
   if (ori==NULL)
      {
         printf ("No se puede leer el archivo");
         return 1 ;
   }

   dest=fopen("D:/destino.txt","wt");
   if (dest==NULL)
   {
      printf ("No se puede grabar el archivo");
      return 1 ;
   }
 
   fgets(cad,80,ori);
   printf ("Palabras del archivo origen:\n");
   while (!feof(ori))
   {
      printf ("%s",cad);   
      fgets(cad,80,ori);
   }
  fclose (ori); 
   printf ("\n");
   /* Escritura de las lineas en forma inversa en el archivo de salida */
   printf ("***************************************\n");
    ori=fopen("D:/origen.txt","rt");
   fgets(cad,80,ori);
   while (!feof(ori))
   {
      inverso(cad);
      printf ("%s",cad);
      fputs (cad,dest);
      fgets(cad,80,ori);
   }
 
   fclose (ori);
   fclose (dest); 
   return 0;
}

void inverso(char *cad)
{

   char *inicio=cad, *temp=cad;

while (*temp)
{
   temp++;
   if (temp=='\0')
   {
      inv(inicio,temp-1);
   }
   else
      if(*temp== ' ')
      {   
         inv(inicio,temp-1);
         inicio=temp+1;
      }
}

   inv(cad,temp-1);
}


void inv (char *inicio, char *fin)
{
   char temp;
   while (inicio<fin)
   {
      temp=*inicio;
      *inicio++ =*fin;
      *fin-- =temp;
   }
}


graciass
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7520
Ubicación: Mexico

MensajePublicado: 20/03/2014 10:05 am
Título:

El error es lógico, en la función "inverso" la sentencia:
Código:
if (temp == '\0')

Debes cambiarla a:
Código:
if (*temp == '\0') /* Indireccion */


Con ello el programa ya invierte todas las palabras pero el avance de linea (el '\n') se coloca justo después de la primera palabra. La solución a ello es:

1) Leer una linea
2) Verificar si termina en '\n' (lo normal) y tomar nota de ello.
3) Si termina en '\n' sobrescribir este con un '\0'.
4) Llamas a la función "inverso" para invertir la linea.
5) La imprimes en el archivo de salida y si la original terminaba en '\n' (pasos 2 y 3) imprimes un '\n' en el archivo de salida.

Tal vez suene demasiado largo pero no lo es y tiene la ventaja de no tener que modificar las funciones que invierten una palabra y una linea.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
hongee



Registrado: 16 Nov 2013
Mensajes: 27

MensajePublicado: 24/03/2014 9:45 am
Título:

Muchas gracias rir3760.

Aquí va el código modificado gracias a tu sugerencia. Te referías a esto verdad?

Código:

fgets(cad,80,ori);
   while (!feof(ori))
   {
      largo=(int)strlen(cad); // largo de la cadena
      cad[largo-1]='\0';// asignamos  '\0' al final de la linea
      inverso(cad);
      printf ("%s\n",cad);
      fputs (cad,dest);
      fputc('\n',dest);// agrego salto de linea en el archivo destino
      fgets(cad,80,ori);
   }


Gracias
saludos
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7520
Ubicación: Mexico

MensajePublicado: 24/03/2014 5:23 pm
Título:

Si pero debes verificar que la linea termine en '\n', si por alguna razón no fuera el caso entonces eliminarías algún otro carácter al final de la cadena.

Otra recomendación es evitar el uso de la función feof en favor de utilizar el valor de retorno de fgets (NULL en caso de error o fin de archivo). Por ultimo puedes imprimir la cadena y el avance de linea con una sola llamada a función (con fprintf), de esta forma:
Código:
while (fgets(cad, 80, ori) != NULL){
   largo = (int) strlen(cad);
   if (cad[largo - 1] == '\n')
      cad[largo - 1] = '\0';
   
   inverso(cad);
   
   printf("%s\n",cad);
   fprintf(dest, "%s\n", cad);
}


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com