Código: TextHola Segun lo que estuve revisando, si no esta el fichero no hace nada, (por los return -1, que hacen que se salga solo), por eso queria ver si tienes un archivo de ejemplo. lo otro es que si no existe el fichero trata igual de ller desde el, por lo tanto pondria esos ciclos dentro del if que pregunta si existe o no el archivo o como un else. tb, preguntas por un .txt para abrir y luego creas un .bin. si puedes explicarme mejor tu idea te ayudaria mas.
Hola otra vezAhi te mando un codigo que te servira para abrir el archivo y guardar los datos que necesitas, solo faltan las notas, espero que te sirva.
#include<stdio.h>#include<string.h>#include<ctype.h>#include<conio.h>#include<malloc.h>struct alumno{char DNI[11];char nombre[25];char apellidos[50];int numero_anyo;};typedef struct alumno DATOSALUMNO;
void main(void){FILE *fp;FILE *ficbin;DATOSALUMNO *d;char dni[10];int i,j;textcolor(WHITE);textbackground(BLUE);clrscr();if((fp=fopen("alumnos.txt", "r"))== NULL)//abrir fichero{ printf("El fichero alumnos.txt no existe\n"); getch(); return ;}
else{ i=0; while(!feof(fp))//cuenta cuantos alumnos hay en el archivo { fscanf(fp, "%d %s", &j, dni); i++; } d=(DATOSALUMNO*)malloc(sizeof(DATOSALUMNO)*i);//crea un areglo para guardar a los alumnos fseek(fp, 0L, SEEK_SET); for(j=0;j<i; j++)//limpia ese arreglo { d[j].DNI[0]='\0'; d[j].nombre[0]='\0'; d[j].apellidos[0]='\0'; d[j].numero_anyo=0; } i=0; while(!feof(fp))//coloca los datos del archivo en el arreglo { fscanf(fp, "%d %s", &j, d.DNI); i++; }}fclose(fp);
ficbin=fopen("Alumnos.bin", "wb");for(j=0;j<i;j++)//pide los datos restantes { clrscr(); fflush(stdin); printf("Datos del alumno con DNI : %s\n\n", d[j].DNI); printf("Introduzca los Apellidos : "); gets(d[j].apellidos); printf("\n"); printf("Introduzca el Nombre : "); gets(d[j].nombre); printf("\n"); printf("Introduzca el Numero de a¤os: "); scanf("%d",&d[j].numero_anyo); fprintf(ficbin,"%s %s %s %d \n",d[j].DNI,d[j].apellidos,d[j].nombre,d[j].numero_anyo);//guarda los datos en archivo binario }fclose(ficbin);free(d);return;}
Hola mira el .cpp o .c son cosas de uso de intrucciones, pero el que te envie es en C.te lo explico a continuacion:Esta es tu estructura que la utilize como la tenias tuCitar#include<stdio.h>#include<string.h>#include<ctype.h>#include<conio.h>#include<malloc.h>struct alumno{char DNI[11];char nombre[25];char apellidos[50];int numero_anyo;};typedef struct alumno DATOSALUMNO;Aqui pregunto si el Archivo Alumnos.txt existeCitarvoid main(void){FILE *fp;FILE *ficbin;DATOSALUMNO *d;char dni[10];int i,j;textcolor(WHITE);textbackground(BLUE);clrscr();if((fp=fopen("alumnos.txt", "r"))== NULL)//abrir fichero{ printf("El fichero alumnos.txt no existe\n"); getch(); return ;}Si existe lo leeo y se guarda en la estructura que definimos arriba, y en la linea del malloc creo el arreglo dinamico. y si no entiendes lo del fseek es una funcion para posicionarce dentro del archivo y lo utilizo para ponerlo al comienzo despues de recorrerloCitarelse{ i=0; while(!feof(fp))//cuenta cuantos alumnos hay en el archivo { fscanf(fp, "%d %s", &j, dni); i++; } d=(DATOSALUMNO*)malloc(sizeof(DATOSALUMNO)*i);//crea un areglo para guardar a los alumnos fseek(fp, 0L, SEEK_SET); for(j=0;j<i; j++)//limpia ese arreglo { d[j].DNI[0]='\0'; d[j].nombre[0]='\0'; d[j].apellidos[0]='\0'; d[j].numero_anyo=0; } i=0; while(!feof(fp))//coloca los datos del archivo en el arreglo { fscanf(fp, "%d %s", &j, d.DNI); i++; }}fclose(fp);y aca se comienza a pedir los datos de los alumnos y se van guardando en el archivo Alumnos.bin, y el fflush se utiliza para limpiar el cache del sistema en este caso el de ingreso por eso lleva el (stdin), ya que al utilizar gets y scanf se tienden a saltar ingresos por eso hay que limpiarlo con el fflush.Citarficbin=fopen("Alumnos.bin", "wb");for(j=0;j<i;j++)//pide los datos restantes { clrscr(); fflush(stdin); printf("Datos del alumno con DNI : %s\n\n", d[j].DNI); printf("Introduzca los Apellidos : "); gets(d[j].apellidos); printf("\n"); printf("Introduzca el Nombre : "); gets(d[j].nombre); printf("\n"); printf("Introduzca el Numero de a¤os: "); scanf("%d",&d[j].numero_anyo); fprintf(ficbin,"%s %s %s %d \n",d[j].DNI,d[j].apellidos,d[j].nombre,d[j].numero_anyo);//guarda los datos en archivo binario }fclose(ficbin);free(d);return;}Cualquier duda que tengas dimelo no mas, tratare de responderte lo mas claro posible.Gracias....
Yo siempre utilizo fprintf para escribir en los archivos ya que asi les doy el formato que yo deseeLo otro que deseaba preguntarte es que datos eran los que guardas en la matriz de tres dimensiones y si se podria utilizar nodos en vez de matrices.Espero tu respuesta gracias.....
Bien!, le hiciste la tarea mientras ella dormia la siesta.. que lindo
Holadisculpa la tardanzalo de la matriz es algo asiM[a][c]donde a es por el numero del alumnodonde b es por el numero de periodo(1 a 3 o sea para los indices de 0 a 2)donde c es la nota de uno de los 5 ejemplo M[0][0][0] //es la nota de la primera asignatura, del primer alumno, en el primer periodoM[0][0][1]//es la nota de la segunda asignatura, del primer alumno, en el primer periodoespero que me entiendas.lo que podrias hacer para validar que el periodo sea de 1 a 3 es cuando te ingresen algo diferente lo pides de nuevo o quiebras el ciclo con un break