在函数imprimir
中,当我在文件中执行fprintf时遇到问题,因为_materias->nombres
没有返回值,因此,文本不显示此信息,请帮忙,因为我不知道发生了什么,如果其他人知道如何在数组中创建结构nombre更好,因为我不会因为strtok而这样做,因为他返回一个char指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *nombre;
int creditos;
float nota;
} curso;
int conteo (FILE * _entrada);
void semestre (FILE * _entrada, curso * _materias, int *_cantidad,
int *_ganadas, int *_perdidas, float *_promedio);
void imprimir (curso * _materias, int *_cantidad, int *_ganadas,
int *_perdidas, float *_promedio);
int main (int argc, char *argv[])
{
int ganadas = 0;
int perdidas = 0;
float promedio = 0.0;
int cantidad = 0;
char archivoEntrada[256];
curso *materias;
printf ("Archivo de entrada \n");
scanf ("%255s", archivoEntrada);
FILE *entrada;
entrada = fopen (archivoEntrada, "r");
if (entrada == NULL) {
printf ("No se logro abrir el archivo de entrada\n");
exit (EXIT_FAILURE);
}
cantidad = conteo (entrada);
materias = (curso *) malloc (sizeof (curso) * cantidad);
semestre (entrada, materias, &cantidad, &ganadas, &perdidas, &promedio);
imprimir (materias, &cantidad, &ganadas, &perdidas, &promedio);
free (materias);
}
int conteo (FILE * _entrada)
{
int i = 0;
char auxiliar[40];
while (!feof (_entrada)) {
fgets (auxiliar, 40, _entrada);
i++;
}
rewind (_entrada);
return i / 3;
}
void semestre (FILE * _entrada, curso * _materias, int *_cantidad,
int *_ganadas, int *_perdidas, float *_promedio)
{
int i = 0;
int sumaCreditos = 0;
float sumaNotas = 0.0;
char auxiliar2[100];
char *token;
fgets (auxiliar2, 100, _entrada);
while (i < *_cantidad) {
fgets (auxiliar2, 100, _entrada);
token = strtok (auxiliar2, ":");
token = strtok (NULL, ":");
(_materias->nombre) = token;
fgets (auxiliar2, 100, _entrada);
token = strtok (auxiliar2, ":");
float val2 = atof (strtok (NULL, ":"));
(_materias->nota) = val2;
fgets (auxiliar2, 100, _entrada);
token = strtok (auxiliar2, ":");
float val = atoi (strtok (NULL, ":"));
(_materias->creditos) = val;
sumaCreditos = sumaCreditos + (_materias->creditos);
if ((_materias->nota) < 3.0) {
*_perdidas = (*_perdidas) + 1;
}
else {
*_ganadas = (*_ganadas) + 1;
}
sumaNotas = sumaNotas + ((_materias->nota) * (_materias->creditos));
i++;
*_materias++;
}
*_promedio = (sumaNotas / sumaCreditos);
}
void imprimir (curso * _materias, int *_cantidad, int *_ganadas,
int *_perdidas, float *_promedio)
{
char archivoSalida[256];
FILE *salida;
printf ("Archivo de salida \n");
scanf ("%255s", archivoSalida);
salida = fopen (archivoSalida, "w");
if (salida == NULL) {
printf ("No se logro abrir el archivo de salida\n");
exit (EXIT_FAILURE);
}
int i = 0;
fprintf (salida, "Archivo de Salida: \n");
fprintf (salida, "Materia\tNota\tCreditos \n");
while (i < *_cantidad) {
fprintf (salida, "%s\t%f\t%d \n", (_materias->nombre),
(_materias->nota), (_materias->creditos));
*_materias++;
i++;
}
fprintf (salida, "\nTotal de materias: %d \n", *_cantidad);
fprintf (salida, "Materias ganadas: %d \n", *_ganadas);
fprintf (salida, "Materias perdidas: %d \n", *_perdidas);
fprintf (salida, "Promedio ponderado: %f \n", *_promedio);
}