2011-01-25 9 views
11

Estoy planeando hacer un editor de texto en c. Entonces solo quería saber qué estructura de datos es buena para guardar el texto. Leí usar la lista vinculada era una forma de hacerlo, pero no eficiente. Por favor, remítame a algunas referencias donde puedo tener una buena idea de lo que necesito usar. Estoy planeando utilizar la biblioteca ncurses para obtener la entrada del usuario y capturar las claves y la IU.Una buena manera de guardar datos al escribir un editor de texto

El uso del código fuente de los editores existentes es algo demasiado complejo, todos los editores de texto son enormes, incluso solo editores de consola. ¿Algún código fuente de editor de consola simple para referencia?

+0

Parece ser una buena forma de * almacenar * datos, ya que guardarlos se refiere a escribirlos en un archivo (que no implica ni debe involucrar ninguna estructura de datos en su programa). (Buena pregunta, sin embargo). –

+0

Wow ... Estaba pensando en esta pregunta, literalmente ayer. +1 por leer mi mente – Tesserex

+1

Puede echar un vistazo a 'ed' (el editor de texto estándar). 'ed' está orientado a líneas y sus partes internas deberían ser bastante simples. Y para aquellos con sentido del humor: http://www.gnu.org/fun/jokes/ed.msg.html –

Respuesta

8

Se beneficiará por reading about Emacs buffers. También vea this blog, especialmente el último comentario, citado aquí por referencia fácil:

Muchas versiones de Emacs, incluyendo GNU, utilizar una única matriz de caracteres contiguos prácticamente dividido en dos secciones separadas por un espacio. Para insertar el espacio se mueve primero al punto de inserción. Los caracteres insertados se llenan en el espacio, reduciendo su tamaño. Si no hay espacio suficiente para mantener los caracteres, se reasigna el búfer completo a un nuevo tamaño mayor y los huecos se unieron en el punto de inserción anterior.

El ingenuo mira esto y dice que el rendimiento debe ser pobre debido a todas las copias involucradas. Incorrecto. La operación de copia es increíblemente rápida y se puede optimizar de varias maneras. Los búfers de Gap también aprovechan los patrones de uso. Puede saltar por toda la ventana antes de enfocar e insertar texto. El espacio no se mueve para mostrar, solo para insertar (o eliminar).

Por otro lado, insertar el bloque de caracteres en la cabecera de un archivo de 500MB y luego insertar otro al final es el peor caso para el enfoque de brecha, especialmente si se excede el tamaño de la brecha. ¿Con qué frecuencia ocurre esto?

Los bloques de memoria contiguos son muy apreciados en entornos de memoria virtual debido a que se requiere menos paginación. Además, las lecturas y escrituras son simplfied porque el archivo no tiene que ser analizado y dividido en alguna otra estructura de datos. Más bien, la representación interna del archivo en el búfer de huecos es idéntica a la del disco y puede leerse y escribirse de manera óptima. Las escrituras se pueden hacer con una sola llamada al sistema (en * nix).

El búfer de brecha es el mejor algoritmo para editar texto de forma general. Utiliza la menor cantidad de memoria y tiene el mayor rendimiento agregado en una variedad de casos de uso. Traducir el búfer de brecha a una ventana visual es un poco más complicado ya que el contexto de la línea debe mantenerse constantemente.

+0

Enlace impresionante, espero que no les importe la edición. –

+2

La afirmación de que el algoritmo de brecha es mejor es una absoluta basura, perpetuada por los fanáticos de emacs durante décadas. Soy fanático de emacs, pero el reclamo sigue siendo basura. El enfoque de "cuerdas", con balances binarios que contienen matrices de caracteres en lugar de caracteres individuales en las hojas, es obviamente óptimo desde un punto de vista teórico, y si simplemente aumenta el tamaño de la hoja lo suficiente, cualquier factor constante desagradable puede hacerse arbitrariamente pequeño. –

+1

@R .. No lo dudo, sin embargo, es una estructura bastante simple que satisfará las necesidades de la mayoría de las personas. Recomendaría a alguien nuevo en la edición de texto que considere la posibilidad de implementar algo simple y sencillo, y luego midiendo el rendimiento para ver si se requiere tiempo adicional de desarrollo y prueba. "Optimización prematura ..." y todo eso. –

3

Si desea que se escale, debe utilizar una forma de árbol binario equilibrado. Es posible hacerlo tan básicamente todas las operaciones - insertar, eliminar, buscar el carácter, buscar la línea, etc. - son O(log n). Si solo te importan los tamaños de archivo "sanos" para el texto (algunos megas como máximo), realmente no importa qué estructuras uses.

+0

Gracias R ... Primero quiero comenzar pequeño ... hacerlo funcionar de la mejor manera posible, por si acaso, me apetece escalarlo más tarde ... – yaami

1

Este link proporciona buena información - Un estudio de caso en el diseño de un "lo-que-ve-es-lo-que-Get" (o "WYSIWYG") editor de documentos

1

Usted debe "salvar" los datos como texto sin formato. Si quiere decir cómo almacenar los datos en la memoria, recomiendo una lista simple vinculada.

Si solo es un editor de texto (no un procesador de textos), el enfoque que tomé fue almacenar cada línea en su propio nodo de enlace.

Este es un enfoque simple y agradable que facilita la inserción y eliminación de líneas.Y la inserción o eliminación de texto es eficiente porque solo los datos dentro del nodo actual deben cambiarse al insertar o eliminar texto.

Dijiste que no querías ver el código fuente pero, no obstante, puedes descargar la versión que escribí hace muchos años en http://www.softcircuits.com/sw_dos.aspx descargando pictor.zip para ver un editor de texto simple.

+0

Gracias por la fuente Jonathan. No quería ver el código fuente porque la mayoría de los editores son demasiado complejos (al menos para mí) para entender lo que está sucediendo. Pero buenos y simples ejemplos son siempre salvavidas. Veré el código que me proporcionó, parece pequeño y agradable :) – yaami

1

El (muy antiguo) libro Software Tools in Pascal implementa una completa ed estilo (piensa vim) editor de texto, búsqueda de expresiones regulares/Reemplazar incluido. Utiliza matrices para contener el texto editado.

Cuestiones relacionadas