struct和fprintf中的char指针

时间:2015-10-04 01:04:30

标签: c

在函数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);
}

0 个答案:

没有答案