[C con Clase] Número de palabras en una fila de texto

Salvador Pozo salvapozo en gmail.com
Mar Abr 7 13:00:17 CEST 2009


Hola:

> Lo que yo me imaginé es lo siguiente:
> crear un array doble char TEXTO[10000][250];
> y cada linea de mi texto lo guardo en un array.
> Sin embargo si mi texto cada vez es mas grande, me imagino que en algún momento llegaré al fin de la memoria.
> Nunca trabajé con memoria dinámica, creo que este será un buen motivo para poder emplearlo; pero podrías indicarme un poco de cómo tienen que estar declaradas mis variables?

Un array como el que planteas es poco flexible. Por una parte, estarás
reservando 250 caracteres para cada línea, aunque las líneas podrán
tener más o menos de 250 caracteres. Para las más cortas estarás
desperdiciando memoria, pero para las más largas tendrás problemas de
pérdida de datos.

Lo mismo se aplica al número de líneas.

No puedes trabajar con un array de ese tipo, necesitas estructuras más
flexibles.

Yo lo enfocaría a una lista dinámica en la que, si usas C++, incluso
puedes sobrecargar el operador [] para manejarla como un array. Cada
nodo contendrá los datos de una línea, por ejemplo:

struct nodolinea {
    long int puntero;
    int nchars;
    char *buffer;
};

En el primer campo almacenamos la posición del fichero en que empieza
la línea, en el segundo, el número de caracteres que contiene.

El tercer campo lo reservamos por si hay que leer esa línea para
modificarla, y si no, lo dejamos con valor NULL.

De este modo, si creas la lista de la forma adecuada, pordemos acceder
a un elemento cualquiera. Para crearla deberás leer todo el archivo
una vez, almacenando en cada nodo la información del puntero y el
número de caracteres.

nodolinea lin;

lin = array[23];  // Por ejemplo

Para leer la línea verificamos si el buffer contiene algo antes:

if(!lin.buffer) {  // No hay texto en el buffer:
   fseek(fichero, lin.puntero, SEEK_SET);
   lin.buffer = new char[lin.nchars+1];
   fread(lin.buffer, 1, lin.nchars, fichero);
}

Dependiendo de lo que vayas a hacer con estos ficheros, necesitarás o
no almacenar los datos de cada línea. Mi consejo es que, cuando lo los
necesites, liberes la memoria dinámica.

Todo esto es sólo un esbozo, no he incluido los campos para generar la
lista enlazada, y si lo haces con templates, esos campos no formarán
parte de "nodolinea", ya que pertenecerán a la estructura dinámica, no
a los datos. En ese caso, yo usaría una clase en lugar de una
estructura.

Existen estructuras diseñadas para estas cosas, pero son complicadas
de usar si no estás familiarizado con ellas.

Hasta pronto.
-- 
Salvador Pozo Coronado
http://www.conclase.net
mailto:salvapozo en gmail.com




Más información sobre la lista de distribución Cconclase