Uso de fgets

La función de biblioteca fgets() es similar a gets(), en que lee una línea de texto de un flujo de entrada. Es mas flexible, ya que permite que el programador especifique el flujo de entrada especifico que debe usar y la cantidad máxima de caracteres que debe ser recibida. Por lo general, la función fgets() se usa para recibir texto de archivos de disco. El prototipo de esta función es

char *  fgets(char * str, int n, FILE * fp);

El ultimo parametro FILE *fp se usa para especificar el flujo de entrada. Se puede especificar stdin (salida estándar) como argumento de flujo.

El apuntador str indica donde será guardada la cadena de entrada. El argumento n especifica la cantidad máxima de carácter que ha de ser recibida. La función fgets() lee caracteres hasta que encuentra una nueva línea o un fin de archivo, o se han leído n-1 caracteres. La nueva línea es incluida en la cadena terminada con un \0 antes de ser guardada.

Uso de fputs

La función de biblioteca fputs() es similar a puts(), en que despliega cadenas.  Es mas flexible, ya que permite que el programador especifique el flujo de salida especifico que debe usar.  Por lo general, la función fputs() se usa para recibir texto a archivos de disco.

El prototipo de esta función es

int   fputs(char * str, FILE * fp);

El ultimo parámetro FILE *fp se usa para especificar el flujo de salida. El apuntador str indica la cadena de caracteres que será impresa.

#include <stdio.h>
#include <string.h>
#define MAX_LEN 20

int main(void) {
  FILE *ent, *sal;
  int fin  = 0;
  char cadena[MAX_LEN];
   ent = fopen("distinct.txt", "r");
  sal = fopen("distinct.dat", "w");
   while ( fgets(cadena, MAX_LEN, ent )!= 0 ){
      fputs(cadena, sal);
  }
    fclose(ent);
  fclose(sal);
   return 0;}

fputc

fputc envía un solo carácter a un flujo especificado. Su prototipo es

itn fputc( int c, FILE * fp );

getc

Las funciones getc () y fgetc() son idénticas y pueden usarse en forma intercambiada. Ellas dan entrada a un solo carácter desde el flujo especificado. El prototipo de getc() esta definido en stdio.h. El siguiente programa lee un archivo de texto y cuenta el número de letras y dígitos que este contiene.

int getc (FILE *fp);

#include <stdio.h>
#include <ctype.h>

int main(void)    {
  int letras, digitos, c;
  FILE *entrada, *salida;

  letras = digitos = 0;
  entrada = fopen("programa.txt", "r");
  while ((c = fgetc(entrada)) != EOF){
    if (isalpha(c) )
      letras++;
    else if ( isdigit(c) )
        digitos++;
     }
    
  fclose(entrada);
  salida = fopen("analisis.txt", "w");
  fprintf(salida, "%d %d\n", letras, digitos);
  fclose(salida);
}

Detección del fin de archivo

Unas veces se sabe que tan largo es un archivo, por lo que no hay necesidad de detectar el fin de archivo. Sin embargo, en otras ocasiones no se sabe que tan largo es el archivo, pero todavía se quieren leer datos del archivo comenzando por el principio y avanzando hasta el fin. Hay dos maneras de detectar el fin de archivo.

Cuando se lee un archivo de modo texto, carácter por carácter, se puede revisar buscando el carácter EOF. La constante simbólica EOF esta definida en stdio.h  como –1, un valor que nunca se usa por un carácter real. Cuando una función de entrada de carácter lee EOF de un flujo en modo texto, se puede estar seguro de que se ha llegado  al final del archivo. Por ejemplo se podría escribir:

while ( ( c= fgetc(fp) ) != EOF )

Otra manera de detectar el fin del archivo es usar la función de biblioteca feof ( ) que puede ser usada tanto para archivos de texto o binarios.

int feof ( FILE * fp )

El argumento fp es el apuntador FILE regresado por fopen() cuando el archivo fue abierto. La función feof() regresa 0 si no se ha llegado al fin de archivo de fp, o diferente de 0 cuando se ha llegado al fin del archivo.