BandaAncha

  • 🔍 en 📰 artículos ⏎
  • 🔍 en 💬 foros ⏎
  • 🔍 en 👇 este 💬 foro ⏎
  • 🔍 en 👇 este 💬 tema ⏎
Regístrate Regístrate Identifícate Identifícate

Leer palabra por línea de un fichero en C sin saber su longitud

Spectrum1

Trato de leer palabras de un fichero, cada línea del fichero contiene una palabra, las palabras tiene distinto tamaño y al uso la función fgets(cad, TAM, archivo), pero esto sólo funciona si se el tamaño exacto de la palabra que contiene la línea.

¿Hay alguna función que me permita sacar la palabra con el tamaño exacto?

Alejandro Santos

Una chapuza que hace lo que pides.... No me pilla el #include el editor de texto pero es con stdio.h

/* Programa que cuenta palabras */

int main(void)
{
FILE *pfsArchivo;
int nContador=0;
char sAux[16]="";
pfsArchivo= fopen("prueba.txt", "r");
if (pfsArchivo== NULL)
printf("No se pudo abrir el archivo %s \n", "prueba.txt");
else
{ while (fscanf(pfsArchivo,"%16s", sAux) != EOF)
{ printf("%16s", sAux);
nContador++;
};
printf ("\nNúmero de palabras = %d \n", nContador);
fclose(pfsArchivo);
}
return 0;
}

djnacho

Bueno.... voy a desempolvar mis conocimientos de C. Vamos al tema (hay que incluir el fichero de cabecera stdio.h, que el editor no me deja ponerlo):

 /* Programa para leer palabras */

 /* Para BandaAncha.eu */

 /* Por Nacho Legido (djnacho) */

 /* OpenSource completo */

 char *lee_palabra(FILE *fichero);

 char *lee_palabra(FILE *fichero)

 {

 char buffer[30]; /* Cada palabra, de 30 caracteres como máximo */

 fgets(buffer,31,fichero); /* Se lee la palabra mediante fgets, se guarda en buffer, 30 caracteres como máximo, del tipo FILE* fichero */

 return buffer; /* Devuelve la cadena de caracteres que corresponde a la palabra+caracter de fin de linea */

 }

 void main(void)

 {

 FILE *fic; /* Variable que permite abrir y cerrar un fichero */

 char palabra[30]; /* Variable que guardará cada palabra */

 fic = fopen("miarchivo.txt","r"); /* Abre el archivo miarchivo.txt para lectura de texto */

 while (feof(fic)==0)

 {

 palabra=lee_palabra(fic); /* Llama a la función lee_palabra, que nos lee una palabra del fichero */

 printf("%s\n",palabra); /* Imprimimos la palabra en cuestión en pantalla. Se imprime palabra+caracter nueva linea */

 }

 printf("\nFin del programa.");

 fclose(fic);

 }

Habría que mirar bien algunas cosas, ya que el código lo acabo de hacer deprisa y corriendo, pero creo que como ejemplo, te podría servir (al igual que el de rwx)
Un saludo :)
PD: La función fgets, va a leer hasta que se lean n-1 caracteres, o hasta que lea el caracter de nueva linea (ahí está el truco que utilizo en mi código, lee 30 caracteres, o antes llega el fin de linea, suponiendo que cada linea tenga menos de 30 caracteres, por eso leo 31 caracteres con fgets).

Spectrum1

Gracias a todos por responder, el problema que tenía es que gets al final de la cadena pone el '\n' y yo estaba comparando esa cadena con otra y al tener '\n', pues nunca coincidia claro. Lo solucine copiandolo a otra cadena quitandole el '\n'. Pero si alguien sabe como coger los datos con fgets u otra función sin el '\n' pues me vendria muy bien.

Muchas gracias.

🗨️ 1
djnacho

La función fgets siempre te va a añadir a la cadena el '\n' (nueva linea), al encontrar el mismo carácter en el fichero que tengas.
Por lo tanto, con fgets, es imposible que el caracter '\n' no aparezca, ya que si lo encuentra en el fichero, lo añade a la cadena, y la función te devuelve la cadena+'\n'

La solución.... la has encontrado tu mismo. Otra cadena, que actúe de buffer, lees la cadena principal, hasta que llegues al '\n', y cuando se haya llegado al carácter '\n', simplemente se sustituye por un '\0' (fin de cadena).

Un saludo :)