Codigo C archivos

Iniciado por felixgz, 5 Septiembre 2016, 04:16 AM

0 Miembros y 1 Visitante están viendo este tema.

felixgz

Hola hice un programa que realiza el registro de calificaciones de 10 alumnos con 5 materias.
Pero apenas voy comenzando a tocar el tema de archivos y no se como guardar los datos que introduje en la ejecución del programa en un archivo de .txt
¿Alguien me puede ayudar?

Este es mi código


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*Definimos dimensiones para el registro de alumnos*/
#define M 11 /*Definimos los renglones para el registro de alumnos*/
#define N 6 /*Definimos las columnas para el registro de materias*/

typedef struct{ /*Define un nuevo tipo de dato llamado Registro
                de tipo estructura y sus punteros*/
char* nombre[M];/*Nombre es un arreglo de 10 elemtos
               y estos son punteros a cadenas, gurda direccion*/
char* clases[N];

float notas[M][N];

}Registro;

void RegistrarAlumnos (Registro *a);
void RegistrarClases (Registro *a);
void RegistrarNotas(Registro *a);
int validarNumero  (char buffer[]);

int main (){

Registro datos;/*Variable de tipo registro*/
int i,j;/*Variable local*/

RegistrarAlumnos (&datos);/*Se le pasa la direccion de datos*/
RegistrarClases (&datos);/*Se le pasa la direccion de datos*/
RegistrarNotas(&datos);

for (i=1;i<M;i++){
printf ("\nNOMBRE DE ALUMNO %d : %s\n",i,datos.nombre[i]);
 
 for (j=1;j<N;j++){
printf ("%s : %.2f\n",datos.clases[j],datos.notas[i][j]);
}

printf("\n\n");
system ("pause");/*Pausa antes de que finalice el programa*/
}
}


void RegistrarAlumnos (Registro *a){/*Arreglo para registro de alumnos*/
   char buffer[50],*auxiliar;/*Buffer guarda momentaneamente el nombre del alumno y el puntero
                         hace referencia a la direccion del buffer*/
   int i=1;/*Nos servira para un ciclo*/
   
   while (i<M){
    printf ("INGRESE NOMBRE Y APELLIDOS :"); fflush (stdin);gets (buffer);/*Ingreso de datos, stdin limpia entradas del teclado,
                                                                     gets lee cadena de caracter y la guarda en buffer*/
  auxiliar=malloc(sizeof(buffer));/*A auxiliar se le asigna el tamaño de bloque de memoria de buffer*/
      if (auxiliar==NULL){/*Se utiliza en caso de que el ordenador no cuente con memoria para auxiliar*/
      printf("ERROR: INSUFICIENTE MEMORIA\n\n"); system ("pause"); exit (-1);
 
  }
  strcpy (auxiliar,buffer);
  a->nombre[i]=auxiliar;/*A a se le asignara la memoria de buffer*/
  i++;/*Contador para alumno*/
}

}

void RegistrarClases (Registro *a){/*Arreglo para registro de materias*/

char buffer[50],*auxiliar;/*Buffer guarda momentaneamente el nombre de la materia y el puntero
                         hace referencia a la direccion del buffer*/
   int i=1;/*Nos servira para un ciclo*/
   system("cls");
   
   while (i<N){
    printf ("INGRESE MATERIAS %d :",i); fflush (stdin);gets (buffer);/*Ingreso de datos, stdin limpia entradas del teclado,
                                                                     gets lee cadena de caracter y la guarda en buffer*/
  auxiliar=malloc(sizeof(buffer));/*A auxiliar se le asigna el tamaño de bloque de memoria de buffer*/
      if (auxiliar==NULL){/*Se utiliza en caso de que el ordenador no cuente con memoria para auxiliar*/
      printf("ERROR: INSUFICIENTE MEMORIA\n\n"); system ("pause"); exit (-1);
 
  }
  strcpy (auxiliar,buffer);
  a->clases[i]=auxiliar;/*A a se le asignara la memoria de buffer*/
  i++;/*Contador para las clases*/

  }
}
 
  void RegistrarNotas(Registro *a){
   int i,j;
   char buffer[10];
   system ("cls");
   
   for (i=1;i<M;i++){/*Se rellena el campo notas*/
        printf("\nALUMNO : %s\n\n\t\tREGISTRO DE CALIFICACION\n\n",a->nombre[i]);    
         
for(j=1;j<N;j++){/*Ciclo para corroborar que las notas sean numeros*/
do{
               printf("%s : ",a->clases[j]);fflush(stdin);gets(buffer);
               }while(!validarNumero(buffer));
a->notas[i][j]=atof(buffer);/*Cadena de caracteres a float*/

      }
  }
}
 
 
  int validarNumero(char buffer[]){
 
  int i=0,verdadero=1;
  while ((buffer[i]!='\0')&&verdadero)
  {
  if((buffer[i]=='1')||(buffer[i]=='2')||(buffer[i]=='3')||(buffer[i]=='4')||
   (buffer[i]=='5')||(buffer[i]=='6')||(buffer[i]=='7')||(buffer[i]=='8')||
   (buffer[i]=='9')||(buffer[i]=='0')||(buffer[i]=='.'))
   verdadero=1;
   
  else
  verdadero=0;
  i++;
  }
  return (verdadero);
  }


[MOD] Usar etiquetas GeSHi para publicar código. Gracias.

AlbertoBSD

Hola.

Primero que nada tienes que definir si quieres guardar la información en formato texto o en formato binario.

Para abrir el archivo tienes:

FILE *archivo = NULL;
archivo = fopen("nombre","w");


Y para guardar los daros tienes 2 funciones fprintf o fwrite dependiendo de si es modo texto o modo.binario.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

felixgz

YA lo intente pero me da errores :/

AlbertoBSD

Que errores te da?

El detalle que como dice tu esctrutura es de apuntadores si guardas esa estructura estaras guardanfo los apuntadores y no los datos apuntados.

Tendrias que guardar registros de longitud variable y guardar los datos de uno en uno
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW