Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
struct和fprintf中的字符指针_C - Fatal编程技术网

struct和fprintf中的字符指针

struct和fprintf中的字符指针,c,C,在函数imprimir中,我在文件中执行fprintf时遇到问题,因为\u materials->nombres不返回值,因此,文本不显示此信息,请帮助我,因为我不知道发生了什么,如果其他人知道如何在数组中的结构nombre中创建,因为我不这样做是因为strtok返回了一个char指针 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char *n

在函数
imprimir
中,我在文件中执行fprintf时遇到问题,因为
\u materials->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);
}
#包括
#包括
#包括
类型定义结构{
char*nombre;
int creditos;
浮动nota;
}库索;
int conteo(文件*_entrada);
无效文件(文件*\u entrada,游标*\u materials,int*\u cantidad,
加纳达斯、佩尔迪达斯、普罗梅迪奥);
无效即席证书(材料证书、证书、证书、,
国际货币基金组织,浮动货币基金组织;
int main(int argc,char*argv[])
{
int-ganadas=0;
int perdidas=0;
浮动承诺=0.0;
int-cantidad=0;
char archivoEntrada[256];
光标*材料;
printf(“归档文件”);
scanf(“%255s”,archivoEntrada);
文件*entrada;
entrada=fopen(archivoEntrada,“r”);
如果(entrada==NULL){
printf(“无任何文件”);
退出(退出失败);
}
cantidad=conteo(entrada);
Materialas=(curso*)malloc(sizeof(curso)*cantidad);
semestre(恩特拉达、马蒂亚斯、康蒂达斯、加纳达斯、佩尔迪达斯和普罗梅迪奥);
临时(材料、康蒂达、加纳达斯、佩迪达斯、普罗米迪奥);
免费(材料);
}
int conteo(文件*_entrada)
{
int i=0;
炭助剂[40];
而(!feof(_entrada)){
fgets(辅助,40,_entrada);
i++;
}
倒带;
返回i/3;
}
无效文件(文件*\u entrada,游标*\u materials,int*\u cantidad,
整数*加纳达斯、整数*佩尔迪达斯、浮动*\promedio)
{
int i=0;
int sumaCreditos=0;
浮式sumaNotas=0.0;
炭助剂2[100];
字符*令牌;
fgets(辅助设备2,100,_entrada);
而(我<*\u cantidad){
fgets(辅助设备2,100,_entrada);
令牌=strtok(辅助符号2,“:”);
令牌=strtok(空,“:”);
(_materials->nombre)=代币;
fgets(辅助设备2,100,_entrada);
令牌=strtok(辅助符号2,“:”);
float val2=atof(strtok(NULL,“:”);
(_materialas->nota)=val2;
fgets(辅助设备2,100,_entrada);
令牌=strtok(辅助符号2,“:”);
float val=atoi(strtok(NULL,“:”);
(_materials->creditos)=val;
sumaCreditos=sumaCreditos+(_materials->creditos);
如果((材料->注释)<3.0){
*_perdidas=(*_perdidas)+1;
}
否则{
*_加纳达斯=(*_加纳达斯)+1;
}
sumaNotas=sumaNotas+((材料->nota)*((材料->信贷));
i++;
*_Materials++;
}
*_promedio=(苏马诺塔/苏马克雷迪托斯);
}
无效即席证书(材料证书、证书、证书、,
整数*(浮点数),浮点数*(浮点数)
{
char archivoSalida[256];
档案*萨利达;
printf(“Archivo de salida\n”);
scanf(“%255s”,archivoSalida);
萨利达=福彭(archivoSalida,“w”);
if(salida==NULL){
printf(“无任何其他文件”);
退出(退出失败);
}
int i=0;
fprintf(萨利达,“萨利达档案:\n”);
fprintf(salida,Materiala\tNota\tCreditos\n);
而(我<*\u cantidad){
fprintf(salida,“%s\t%f\t%d\n”,(\u materials->nombre),
(材料->备注),(材料->信用证);
*_Materials++;
i++;
}
fprintf(salida,“\n材料总量:%d\n”,*\u cantidad);
fprintf(salida,“材料加纳达斯:%d\n”,*\u加纳达斯);
fprintf(salida,“材料/材料:%d\n”,*\u-perdidas);
fprintf(salida,“Promedio Poundado:%f\n”*\u Promedio);
}

可能是因为
token
是一个堆栈变量。请正确缩进您的代码,因为这样很难读取,也请在“}”后面加空格,在“,”后面加空格,在“=”前面和后面加空格。我回答了很多问题。我甚至为今天的某个人写了一个程序来教他们,因为我要求他们缩进代码,他们做到了。这只是尊重。这里的人们不必试图阅读随意发布的代码,就有足够的时间了。考虑并帮助那些试图帮助你的人。这是无法理解的。好的,谢谢,现在的问题是,nombre值是一个字符指针,等于strtok给出的值,在函数imprimir中我做了“fprintf(salida,“%s\t%f\t%d\n”,(\u materials->nombre),(\u materials->nota),(\u materials->creditos));”这不是nombre的函数,你想替换
(\u materials->nombre->nombre)=令牌通过
(\u materials->nombre)=标准(令牌)