Programación en C: Estructuras, Punteros y Manejo de Archivos con Ejemplos Prácticos

Enviado por cristian y clasificado en Informática

Escrito el en español con un tamaño de 6,25 KB

Programación en C: estructuras, punteros y manejo de archivos

A continuación se presentan varios ejemplos en lenguaje C que ilustran el uso de estructuras (struct), punteros y manejo de archivos.

1. Estructuras y punteros

1.1 Punto en el plano

Se define una estructura s_Punto que representa un punto con coordenadas X e Y. Se calcula la distancia entre dos puntos mediante la fórmula euclidiana.

struct s_Punto{
       float punX;
       float punY;
};
typedef struct s_Punto Punto;
typedef struct s_Punto *pPunto;

void LeerPunto(pPunto p) {
     float x,y;
     printf("Ingrese la coordenada x:");scanf("%f",&x);
     printf("Ingrese la coordenada y:");scanf("%f",&y);
     p->punX=x;
     p->punY=y;
}

void PresentarPunto(Punto p) {
     printf("Las coordenadas son (%f;%f)",p.punX,p.punY);
}

float DistanciaPuntos(Punto p, Punto q){
  float distancia;
  distancia=sqrt((p.punX-q.punX)*(p.punX-q.punX)+(p.punY-q.punY)*(p.punY-q.punY));
  return distancia;
}

int main(int argc, char *argv[]){
  Punto asd;
  Punto asd2;
  printf("Indique cuales son las coordenadas x,y del punto 1\n");
  LeerPunto(&asd);
  printf("Indique cuales son las coordenadas x,y del punto 2\n");
  LeerPunto(&asd2);
  printf("El punto ordenado es");
  PresentarPunto(asd);
  PresentarPunto(asd2);
  float x = DistanciaPuntos(asd,asd2);
  printf("La distancia entre los puntos es: %5.2f",x);
  printf("\n");
  system("PAUSE");
  return 0;
}

1.2 Fracción

Ejemplo de una estructura Fraccion con numerador y denominador, con lectura y presentación de sus valores.

struct s_Fraccion{
  float denominador;
  float numerador;
};
typedef struct s_Fraccion Fraccion;
typedef struct s_Fraccion *pFraccion;

void LeerFraccion(pFraccion f) {
  float d,n;
  printf("Ingrese el numero del denominador:");scanf("%f",&d);
  printf("Ingrese el numero del numerador:");scanf("%f",&n);
  f->denominador=d;
  f->numerador=n;
}

void PresentarFraccion(Fraccion f) {
  printf("La fraccion es (%5.2f/%5.2f)",f.numerador,f.denominador);
}

int main(int argc, char *argv[]) {
  Fraccion asdasd;
  printf("Indique cuales son los valores de la fraccion (numerador y denominador)\n");
  LeerFraccion(&asdasd);
  printf("La fraccion es\n\n");
  PresentarFraccion(asdasd);
  system("PAUSE");
  return 0;
}

1.3 Persona con fecha de nacimiento

Estructuras anidadas: Persona contiene una Fecha de nacimiento.

struct s_Fecha {
  int day;
  int month;
  int year;
};
typedef struct s_Fecha Fecha;
typedef struct s_Fecha *pFecha;

struct s_Persona {
  char nombre[30];
  Fecha nacimiento;
};
typedef struct s_Persona Persona;
typedef struct s_Persona *pPersona;

void LeerFecha(pFecha fecha) {
  int d,m,y;
  printf("Ingrese dia:");scanf("%d",&d);
  printf("Ingrese mes:");scanf("%d",&m);
  printf("Ingrese año:");scanf("%d",&y);
  fecha->day = d;
  fecha->month = m;
  fecha->year = y;
}

void PresentarFecha(pFecha f) {
  printf("%d/%d/%d",f->day,f->month,f->year);
}

void LeerPersona(pPersona p) {
  char nombre[30];
  Fecha cumple;
  printf("Ingrese nombre:");
  gets(nombre);
  printf("Ingrese nacimiento\n");
  LeerFecha(&cumple);
  strcpy(p->nombre,nombre);
  p->nacimiento.day = cumple.day;
  p->nacimiento.month = cumple.month;
  p->nacimiento.year = cumple.year;
}

void PresentarPersona(Persona p) {
  printf("%s nació el ",p.nombre);
  printf("%d/%d/%d",p.nacimiento.day,p.nacimiento.month,p.nacimiento.year);
}

int main(int argc, char *argv[]) {
  Persona alumno;
  printf("Indique los datos solicitados\n");
  LeerPersona(&alumno);
  printf("El alumno leído es:");
  PresentarPersona(alumno);
  printf("\n");
  system("PAUSE");
  return 0;
}

2. Manejo de archivos

2.1 Crear un archivo de texto

Crea el archivo datos.txt en modo escritura ("w") y lo cierra.

int main (int argc,char *argv[]){
  FILE *archivo;
  char nombre[10]="datos.txt";
  archivo=fopen(nombre,"w");
  printf("Creando archivo: %s\n",nombre);
  if(archivo){
    printf("Creado\n");
    fclose(archivo);
    printf("Cerrado\n");
  }
  else{
    printf("Error");
    return 0;
  }
  system("pause");
}

2.2 Escribir líneas en un archivo

Se leen líneas desde teclado y se graban en datos.txt hasta introducir una línea vacía.

int main(int argc,char *argv[]){
  FILE *archivo;
  char linea[80];
  char nombre[10]="datos.txt";
  archivo=fopen(nombre,"w");
  printf("Creando y grabando");
  printf("Termine pulsando ENTER");
  if(archivo){
    gets(linea);
    while(strlen(linea)!=0){
      fprintf(archivo,linea);
      fprintf(archivo,"\n");
      gets(linea);
    }
    fclose(archivo);
    printf("Archivo cerrado\n");
  } else{
    printf("Error");
    return 0;
  }
  system("pause");
}

2.3 Leer un archivo carácter a carácter

int main(){
  FILE *archivo;
  int c;
  archivo=fopen("datos.txt","r");
  printf("Leyendo");
  do{
    c=fgetc(archivo);
    printf("%c",c);
  }
  while(!feof(archivo));
  fclose(archivo);
  system("pause");
}

2.4 Leer un archivo línea a línea

Lectura por líneas con fgets, método más eficiente y legible para archivos de texto.

int main(){
  FILE *archivo;
  char linea[80];
  archivo=fopen("datos.txt","r");
  printf("Leyendo");
  fgets(linea,80,archivo);
  while(!feof(archivo)){
    printf("%s",linea);
    fgets(linea,80,archivo);
  }
  fclose(archivo);
  system("pause");
}

Conceptos clave

struct: agrupa variables de distintos tipos bajo un mismo nombre. typedef: crea alias para tipos. Puntero: almacena una dirección de memoria, permitiendo el paso por referencia. FILE: tipo que representa un flujo de archivo. fopen / fclose: abren y cierran archivos. fprintf / fgets / fgetc: operaciones de escritura y lectura.