代码之家  ›  专栏  ›  技术社区  ›  Norhther

malloc文件的未处理行

c
  •  0
  • Norhther  · 技术社区  · 7 年前

    struct JugadorStruct_t {
    int fichas, manos_ganadas, manos_perdidas;
    char* nombre;
    int* fichas_partidas;
    };
    

    我想用txt文件中的一些值初始化这个结构,所以我执行以下操作:

    int initJugador(JugadorPtr_t jugador) {
        FILE* fp = 
    fopen("/home/norhther/CLionProjects/blackjack/jugador.txt","r");
    
    if (fp == NULL) {
        printf("El archivo del jugador no existe\n");
        fclose(fp);
        return 1;
    }
    else {
        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) {
            printf("%s", line);
        }
    }
    
    fclose(fp);
    return 0;
    }
    

    (前提是文件至少有4行)

    有什么好办法可以达到这个目的吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jonathan Leffler    7 年前

    这是对代码的一个修改,它可以满足您的需要。注意,文件名在 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