| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
hongee
Registrado: 16 Nov 2013 Mensajes: 23
| Publicado: 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: 7516 Ubicación: Mexico
| Publicado: 20/03/2014 10:05 am | | | Título: |
| El error es lógico, en la función "inverso" la sentencia:
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: 23
| Publicado: 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: 7516 Ubicación: Mexico
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |