这是对代码的一个修改,它可以满足您的需要。注意,文件名在
main()
Is it a good idea to typedef pointers?
简短的回答是“不”。
该代码将两个字段添加到结构中,以记录可以存储在
fichas_perdidas
数组,以及存储的实际条目数。分配代码利用
当传递空指针时,
realloc()
表现得像
malloc()
stderr
指示用于错误消息的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct JugadorStruct_t
{
int fichas, manos_ganadas, manos_perdidas;
char *nombre;
int *fichas_partidas;
int max_fichas;
int num_fichas;
};
typedef struct JugadorStruct_t *JugadorPtr_t; // Don't do this!
static
int initJugador(JugadorPtr_t jugador, const char *file)
{
FILE *fp = fopen(file, "r");
if (fp == NULL)
{
printf("El archivo del jugador no existe\n");
fclose(fp);
return 1;
}
char *line = NULL;
size_t len = 0;
getline(&line, &len, fp);
jugador->nombre = strdup(line);
getline(&line, &len, fp);
jugador->fichas = atoi(line);
getline(&line, &len, fp);
jugador->manos_ganadas = atoi(line);
getline(&line, &len, fp);
jugador->manos_perdidas = atoi(line);
while (getline(&line, &len, fp) != -1)
{
int x = strtol(line, 0, 0); /* Extremely sloppy */
if (jugador->num_fichas >= jugador->max_fichas)
{
size_t new_number = 2 * jugador->max_fichas + 2;
size_t new_buflen = new_number * sizeof(*jugador);
void *new_buffer = realloc(jugador->fichas_partidas, new_buflen);
if (new_buffer == NULL)
{
fprintf(stderr, "Out of memory (requesting %zu bytes)\n",
new_buflen);
free(jugador->nombre);
free(jugador->fichas_partidas);
fclose(fp);
return -1;
}
jugador->fichas_partidas = new_buffer;
jugador->max_fichas = new_number;
}
jugador->fichas_partidas[jugador->num_fichas++] = x;
}
fclose(fp);
return 0;
}
static void printJugador(const char *tag, struct JugadorStruct_t *jp)
{
printf("%s (%p):\n", tag, (void *)jp);
printf("Nombre: [%s]\n", jp->nombre);
printf("Fichas: %d\n", jp->fichas);
printf("Manos Ganadas: %d\n", jp->manos_ganadas);
printf("Manos Perdidas: %d\n", jp->manos_perdidas);
printf("Num Fichas: %d\n", jp->num_fichas);
printf("Max Fichas: %d\n", jp->max_fichas);
for (int i = 0; i < jp->num_fichas; i++)
printf("%2d: %d\n", i + 1, jp->fichas_partidas[i]);
}
int main(void)
{
struct JugadorStruct_t j = { 0 };
initJugador(&j, "jugador.txt");
printJugador("After reading", &j);
return 0;
}
Line for nombre
32
27
19
12345
23456
34567
45678
56789
67890
99999999
程序输出:
After reading (0x7ffee84ee400):
Nombre: [Line for nombre
]
Fichas: 32
Manos Ganadas: 27
Manos Perdidas: 19
Num Fichas: 7
Max Fichas: 14
1: 12345
2: 23456
3: 34567
4: 45678
5: 56789
6: 67890
7: 99999999