• Sábado 14 de Diciembre de 2024, 21:32

Autor Tema:  Problemas Con Fopen  (Leído 1597 veces)

elbaulico

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Problemas Con Fopen
« en: Martes 20 de Enero de 2004, 09:33 »
0
Resulta que tengo un archivo llamado "stop_words.txt" que contiene una serie de palabras. El programa principal lo que hace es leer el contenido de otro archivo llamado "texto.txt", copiarlo a otro archivo llamado "salida.txt" pero que no contengan las palabras que hay en el archivo de palabras prohibidas("stop_words.txt"). Lo que pasa que al ejecutar el programa principal, no me da problema hasta que ha leido y guardado un numero considerable de palabras, es decir, al principio lo hace bien pero despues, dice que no puede abrir el archivo, habiendolo abierto antes muchisimas veces. La verdad es que no se por que pasa esto. Aqui os dejo la funcion por si os sirve de ayuda. Gracias

char cad[20]; // Variable global

// Devuelve un 1 si es stopwords y un 0 si no lo es
int es_stopwords(unsigned char cadena[20])
{
    FILE *stop; // Archivo con las palabras stopwords
    char auxiliar[20];
    char ch;
    int j = 0;
    char salto ='\n';

    // Se abre el archivo con todos los documentos en modo texto y de solo lectura
    if ((stop = fopen("c:\\docum\\stop_words.txt", "r")) == NULL)
    {
        fprintf(stderr, "No se puede abrir el archivo stop_words);
        getch();
        return 1;
    }

    inicializa(auxiliar);
    while (!feof(stop))
    {
         ch = getc(stop);
         if (ch != salto)
         {
            auxiliar[j]=ch;
            j++;
         }

         if (ch == salto || strcmp(cad,auxiliar) == 0)
         {
            if (strcmp(cad,auxiliar)== 0)
               return 1;
            else
            {
               inicializa(auxiliar);
               j=0;
            }
         }// Fin del if
         else if (ch == salto)
         {
            inicializa(auxiliar);
                j=0;
         } // Fin de else
    } // Final del archivo
    fclose(stop); // Se cierra el archivo con las stopwords
    return 0;
} // Fin de es_stopwords

// Inicializa la cadena auxliar
void inicializa(unsigned char cadena[20])
{
   //free(cad);
   //cadena=(char *) malloc (20*sizeof(char));

   for(int i=0;i<=20;i++)
      cadena='\0';
}// Fin de inicializacion

chuidiang

  • Miembro MUY activo
  • ***
  • Mensajes: 123
  • Nacionalidad: es
    • Ver Perfil
    • http://www.chuidiang.com
Re: Problemas Con Fopen
« Respuesta #1 en: Martes 20 de Enero de 2004, 09:53 »
0
Soy un poco vago para revisar tu código, pero te cuento un posible problema.

El número de ficheros abiertos simultaneamente está limitado. Si abres ficheros (aunque sea el mismo muchas veces) y sin querer te lo dejas abierto, al final llegará un momento en que no podrás abrirlo.

Revisa en tu código que tanto el fichero que vas a leer como el que estás escribiendo, se abre y se cierra correctamente.

Otro posible problema es que dejes memoria sin liberar. Llegará un momento en que no podrás abrir ficheros, pero posiblemente también notes que el ordenador empieza a ir muy lento.

Se bueno.

elbaulico

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Problemas Con Fopen
« Respuesta #2 en: Martes 20 de Enero de 2004, 10:26 »
0
Me faltaba un fclose por poner. Creo que eso esta solucionado. Gracias, pero ahora si alguien me puede explicar como liberar memoria de cadenas, ya que esas cadenas no se que longitud tienen hasta que no lea el archivo y coja una palabra(es decir, el array de caracteres se va llenando hasta que haya un espacio en blanco o un salto de linea).
Yo lo que he hecho es definir una variable global llamada "char cadena[20];", pero no reservo memoria ni nada. En ese tema estoy muy flojo. Y al final me da un error "thread stopped. Fault access violation at 0xffffffff"

chuidiang

  • Miembro MUY activo
  • ***
  • Mensajes: 123
  • Nacionalidad: es
    • Ver Perfil
    • http://www.chuidiang.com
Re: Problemas Con Fopen
« Respuesta #3 en: Martes 20 de Enero de 2004, 15:10 »
0
El tema es sencillo.

Si en algún sitio haces malloc(), debe haber un free() de esa memoria.
En tu caso, puesto que la variable es global y es un array, no necesitas hacer ningun free().

Leer líneas de un fichero es un problema, porque a priori nunca sabes que longitud tienes. La solución sencilla es la que has hecho tú, poner un array (cadena) lo suficientemente grande como para que quepa cualquier linea de tu fichero. En tu caso, la máxima línea que puedes leer es 19 caracteres más el fin de cadena (el \0 que se pone al final).

Una opción no eficiente consiste en leer dos veces el fichero. La primera para determinar la longitud de la línea (de caracter en caracter) y luego leer la línea.

Si quieres algo más eficiente (pero más elaborado), debes leer con fgets(), que lee hasta que encuentre un fin de linea, fin de fichero o alcance el tamaño máximo que tu le pides

fgets (cad, 20, stop);  // Lee hasta fin de linea o un máximo de 19 caracteres.

Esta función lee hasta fin de linea o 19 caracteres como máximo(añade un \0 al final).
Si se para por un fin de linea, todo correcto.
Si se para porque ha leido 20 caracteres, debes volver a leer e ir concatenando (función strcat()).
Para esto último, posiblemente debas meterte en calloc() y free().

Se bueno

elbaulico

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Problemas Con Fopen
« Respuesta #4 en: Martes 20 de Enero de 2004, 19:52 »
0
Gracias, lo intentare a ver, aunque tengo que cambiar mucho codigo para eso, pero bueno, eso es lo que hay.