Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Editor de texto

Estas en el tema de Editor de texto en el foro de C/C++ en Foros del Web. Hola que tal, les mando un saludo; Intento realizar un pequeño ejecutable que me permita guardar en un documento de texto, lo que escriba en ...
  #1 (permalink)  
Antiguo 20/10/2010, 19:13
Avatar de saudakar  
Fecha de Ingreso: octubre-2010
Ubicación: Donde pueda beber Cafe
Mensajes: 11
Antigüedad: 13 años, 6 meses
Puntos: 5
Editor de texto

Hola que tal, les mando un saludo;

Intento realizar un pequeño ejecutable que me permita guardar en un documento de texto, lo que escriba en la consola, incluyendo los espacios, si presiono enter que incluya ese salto de linea en el documento de texto, casi todo funciona bien,... el problema que tengo viene dado a que por ejemplo si yo escribo:

Esto es una prueda de
edicion de textos,
inclyendo los saltos de linea.
.
//Me guarda en el archivo de texto:
sto es una prueda de
dicion de textos,
nclyendo los saltos de linea.
.

No toma en cuenta la primera letra de cada linea,
PD. Cuando ingreso un punto como primer caracter y presiono enter, termina la edicion,... ¿Alguna sugerencia para arreglar el error de la primera letra?

adjunto el codigo:

Código c++:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <iostream.h>
  4. #include <fstream>
  5. #define RC 13    
  6. #define AL 10
  7.  
  8. int main()
  9. {
  10.     ofstream doc;
  11.     char c;
  12.     char texto[1000];
  13.     doc.open("datos.txt");
  14.  
  15.     printf("Introduzca el texto,  para terminar.\n");
  16.     do
  17.     {
  18.         c = _getch();              
  19.         putchar(c);                
  20.         if (c == RC)
  21.         {
  22.          putchar(AL);   // Si es retorno de carro coloca una nueva linea
  23.  
  24.         }
  25.         cin.getline (texto, 1000);
  26.         doc << texto <<endl;
  27.     }
  28.     while (c != '.');
  29.     printf("\nFin del programa.\n");
  30.     getch();
  31.     return 0;
  32. }

Última edición por saudakar; 20/10/2010 a las 19:22
  #2 (permalink)  
Antiguo 21/10/2010, 13:24
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Editor de texto

Simple: estás leyendo un caracter y luego guardando el resto de la línea en el archivo.
La entrada estándar es secuencial: no vas hacia atrás cada vez que se lee. Por eso getline lee a partir del caracter que ya leíste.

Quizás te sirva más hacer el getline() desde el principio y luego verificar si el tamaño de la cadena leída es cero, eso indicaría que se leyó una cadena vacía (solamente un salto de línea)

Comentario aparte: analiza qué pasa si la primer línea de entrada es un punto. Me parece que podés tener efectos desagradables

Saludos.
  #3 (permalink)  
Antiguo 21/10/2010, 17:16
Avatar de saudakar  
Fecha de Ingreso: octubre-2010
Ubicación: Donde pueda beber Cafe
Mensajes: 11
Antigüedad: 13 años, 6 meses
Puntos: 5
Respuesta: Editor de texto

Hola compañero, gracias por tu respuesta, bueno si logre corregir el problema comparando si char[N] esta vacio, ...

Si, tienes razon en cuanto coloco como primer caracter el punto, ya no se puede salir del programa, pero lo arregle con un bucle while, en lugar de un do while,...

Bueno ahora no finaliza la edicion del texto cuando presiono el punto, solo si presiono el punto despues de una linea vacia, Intente tambien comparando la variable char texto si era igual a . pero alli si surge el problema de nuevo que cuando coloco . como primer caracter ya no se sale del programa, ¿Es posible corregirlo?, de serlo ¿Como podria?



Saludos!

PD
Adjunto codigo:

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <iostream.h>
  4. #include <fstream.h>
  5. #include <string.h>
  6. #define AL 10  
  7.  
  8. int main()
  9. {
  10.     ofstream doc;
  11.     int c;
  12.     char texto[1000];
  13.     doc.open("datos.txt");
  14.  
  15.     cout <<"/Introduzca el texto/" <<endl;
  16.     cout <<"Para Finalizar la edicion, introducir un punto " << endl;
  17.     while (c != '.')
  18.     {
  19.       cin.getline (texto, 1000);
  20.       if (strlen(texto) == 0)
  21.       {
  22.        putchar(AL);
  23.        c = _getch();
  24.        }
  25.       doc << texto <<endl;
  26.     }
  27.     cout << "Fin de la edicion de Texto" <<endl;
  28.     return 0;
  29. }




Nuevos Datos Agregados:

Esto es lo que tengo hasta ahora;
Dejo el codigo, para que pueda servir a cualquiera que como yo este en fase Alfa XD (ni al primer nivel en C++ llego)

PD. Creo que me gusta bien como esta, asi que tenga que escribir el punto despues de una linea en blanco, asi es mas delimitante cuando ya no se quiere escribir mas,...
Pero siempre sigo con la duda del porque, agradezco me puedan explicar...
Saludos

Otra Post Data:
El codigo que escribo quiza no cumpla estandares, pero es lo que se me ocurre, ¿Hay alguna forma mas "Estandar" o Tecnica de escribirlo?

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <iostream.h>
  4. #include <stdlib.h>
  5. #include <fstream.h>
  6. #define SALTO_LINEA 10
  7. char *Opciones[]={" [1] Sobreescribir      ",
  8.          " [2] Agregar Texto  ",
  9.          " [3] Leer Archivo  ",
  10.          " [4] Salir      "};
  11.  
  12. //****************************************************************************
  13. //****************************************************************************
  14.  
  15. void Sobreescribir()
  16. {
  17.     ofstream doc;
  18.     int c;
  19.     char texto[1000];
  20.     doc.open("datos.txt");
  21.  
  22.     gotoxy (1,16); cout <<"Se va a editar el archivo ""datos.txt" << endl;
  23.     cout <<"Para Finalizar la edicion, introducir un punto despues de una linea vacia" << endl<<endl;
  24.     gotoxy (28,18);cout <<"////Introduzca el texto////" <<endl;
  25.     //while (strlen(texto) != '.')
  26.     while (c != '.')
  27.     {
  28.       cin.getline (texto, 1000);
  29.       if (strlen(texto) == 0)
  30.       {
  31.        c = _getch();
  32.        putchar(SALTO_LINEA);
  33.       }
  34.       doc << texto <<endl;
  35.     }
  36.     cout << "Fin de la edicion de Texto" <<endl;
  37.  
  38. }
  39.  
  40. //****************************************************************************
  41. //****************************************************************************
  42.  
  43. void AgregarTexto()
  44. {
  45.     ofstream doc("datos.txt", ios::app);
  46.     int c;
  47.     char texto[1000];
  48.     gotoxy (1,16); cout <<"Se va a agregar texto al archivo datos.txt" << endl;
  49.     cout <<"/Introduzca el texto/" <<endl;
  50.     cout <<"Para Finalizar la edicion, introducir un punto despues de una linea vacia" << endl;
  51.     //while (strlen(texto) != '.')
  52.     while (c != '.')
  53.     {
  54.       cin.getline (texto, 1000);
  55.       if (strlen(texto) == 0)
  56.       {
  57.        c = _getch();
  58.        putchar(SALTO_LINEA);
  59.       }
  60.       doc << texto <<endl;
  61.     }
  62.     cout << "Fin de la edicion de Texto" <<endl;
  63. }
  64.  
  65. //****************************************************************************
  66. //****************************************************************************
  67.  
  68. void LeerTexto()
  69. {
  70.     ifstream doc("datos.txt", ios::noreplace);
  71.     char linea[128];
  72.     long contador = 0L;
  73.  
  74.     gotoxy (1,16); cout <<"Mostrando el archivo datos.txt " << endl << "Para una lectura mas comoda se muestran de 24 en 24 lineas" << endl;
  75.     if(doc.fail())
  76.     cerr << "Error al abrir el archivo Pruebas.txt" << endl;
  77.     else
  78.     while(!doc.eof())
  79.     {
  80.         doc.getline(linea, sizeof(linea));
  81.         cout << linea << endl;
  82.         if((++contador &#37; 24)==0)
  83.         {
  84.             cout << "CONTINUA...";
  85.             cin.get();
  86.         }
  87.     }
  88.     cout << endl << endl << endl <<"-------------------------------" << endl;
  89.     cout << "Fin del contenido" << endl;
  90.     cout << "Precione cualquier tecla para continuar..." << endl;
  91.     getch();
  92.     doc.close();
  93.  
  94. }
  95.  
  96. //****************************************************************************
  97. //****************************************************************************
  98.  
  99. void Resalta(int Y)
  100. {
  101.     textcolor(RED);
  102.     textbackground(7);
  103.     gotoxy(30,7+Y); cprintf("%s",Opciones[Y-1]);
  104.     textcolor(BLUE);
  105.     textbackground(BLACK);
  106. }
  107.  
  108. //****************************************************************************
  109. //****************************************************************************
  110.  
  111. void RealizarOperacion(int Opc)
  112. {
  113.     switch(Opc)
  114.     {
  115.         case 1: Sobreescribir();   break;
  116.         case 2: AgregarTexto(); break;
  117.         case 3: LeerTexto();  break;
  118.         case 4: exit(0);
  119.     }
  120.     getch();
  121. }
  122.  
  123. //****************************************************************************
  124. //****************************************************************************
  125. int main()
  126. {
  127.     char Opc;
  128.     int Y=1;
  129.    int i;
  130.     textmode(C80);//Sirve para que la consoloa cambie a modo texto con medida 80 x 25
  131.  
  132.     do
  133.       {
  134.           textcolor(GREEN);
  135.          textbackground(BLACK);
  136.           clrscr();
  137.  
  138.           gotoxy(30,5); cprintf("*** OPCIONES ***");
  139.           for(i=0; i<4; i++)
  140.               {
  141.                gotoxy(30,8+i);  cout << Opciones[i];
  142.           }
  143.  
  144.          Resalta(Y);
  145.           Opc=getch();
  146.           switch(Opc)  //claves: 72=>flecha arriba 80=>flecha abajo 13=>Enter.
  147.              {
  148.                case 72: if(Y==1) Y=4; else Y--; break;
  149.                case 80: if(Y==4) Y=1; else Y++; break;
  150.                case 13: RealizarOperacion(Y);
  151.              }
  152.     }while(1);
  153. }

Última edición por saudakar; 21/10/2010 a las 20:14 Razón: Agregados nuevos Datos
  #4 (permalink)  
Antiguo 22/10/2010, 09:20
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Editor de texto

No era necesario quitar el do...while, el problema con tu código corregido es que cuando la cadena está vacía, lee un nuevo caracter. Seguramente se esté "comiendo" el primer caracter de la línea siguiente a una línea vacía debido a eso.

Código C++:
Ver original
  1. bool continuar = true;
  2. do {
  3.     cin.getline (texto, 1000);
  4.     if ( (strlen(texto) == 1) && (texto[0] == '.') ) {
  5.         continuar = false;
  6.     } else {
  7.         // guardar línea
  8.     }
  9. } while (continuar);

Otra cosa: no es necesario considerar el caso de una línea vacía, la forma en la que estás escribiendo (cout << texto <<endl) asegura que habrá un salto de línea, y como texto está vacía, ese salto de línea será lo único que se escriba.


Saludos.
  #5 (permalink)  
Antiguo 22/10/2010, 11:34
Avatar de saudakar  
Fecha de Ingreso: octubre-2010
Ubicación: Donde pueda beber Cafe
Mensajes: 11
Antigüedad: 13 años, 6 meses
Puntos: 5
Respuesta: Editor de texto

Buen dia Compañero,...

Gracias por tu correccion,

me podrias dar una breve reseña de la comparcion del if?

No comprendo exactamente que se compara

Código C++:
Ver original
  1. if ( (strlen(texto) == 1) && (texto[0] == '.')

Segun comprendo esto verifica asi

Si texto contiene texto y la posicion inicial (0) es un punto, fin del bucle,...

Saludos!!
  #6 (permalink)  
Antiguo 22/10/2010, 12:07
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Editor de texto

Casi: si "texto" tiene 1 solo caracter (largo 1), y la primera posición es un punto (como el largo es 1, la primera posición es la única)
  #7 (permalink)  
Antiguo 22/10/2010, 21:39
Avatar de saudakar  
Fecha de Ingreso: octubre-2010
Ubicación: Donde pueda beber Cafe
Mensajes: 11
Antigüedad: 13 años, 6 meses
Puntos: 5
Respuesta: Editor de texto

Que bien,...

Muchisimas gracias compañero!!,

tengo claras las dudas,...
creo que se puede dar por solucionado el problema


Ciao....

Etiquetas: editar, guardar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:43.