Чтение строки из текстового файла и размещение данных через пробел внутри структуры - PullRequest
0 голосов
/ 05 июня 2018

Я должен написать функцию на C, которая принимает в качестве входных данных указатель файла и возвращает структуру, подобную этой:

typedef struct product{
    char * code_product;
    char * name;
    char * code_piece;
    only_time_t enter;
    only_time_t exit;
}product_t;

Эта структура использует другую структуру, подобную этой:

typedef struct only_time{
    int hour;
    int minute;
    int second;
}only_time_t;

Для чтения из файла я использую функцию getline(), а функцию strtok() - для создания токенов.Вот функция, которую я использую для чтения из файла:

product_t * read_line(FILE * fp){
    char * line = NULL;
    size_t len = 0;
    product_t * temp;
    int i = 0;

    temp = (product_t *) malloc(sizeof(product_t));

    temp->code_product = (char *) malloc(sizeof(char) * 4);
    temp->name = (char *) malloc(sizeof(char) * 60);
    temp->code_piece = (char *) malloc(sizeof(char) * 4);

    //read a line from the file
    getline(&line, &len, fp);

    //handle line info info
    char *tokens[80];

    tokens[0] = strtok(line," ,.");

    while (tokens[i] != NULL) {
        i++;
        tokens[i] = strtok(NULL," ,.");                             
    }

    temp->code_product = tokens[0];
    temp->name = tokens[1];
    temp->code_piece = tokens[2];
    temp->enter = timestring_to_time(tokens[3]);
    temp->exit = timestring_to_time(tokens[4]);

    //cleanup
    if (line)
        free(line);
    return(temp);
}

Чтобы увидеть, что прочитала программа, я использую простую функцию, которая печатает структуру:

void print_product(product_t * product){
    printf("product_t code_product: %s \n", product->code_product);
    printf("product_t name: %s \n", product->name);
    printf("product_t code_piece: %s \n", product->code_piece);
    printf("product_t enter: %d:%d:%d \n", product->enter.hour,product->enter.minute,product->enter.second);
    printf("product_t exit: %d:%d:%d \n", product->exit.hour,product->exit.minute,product->exit.second);
}

Iнастроить тестовый сценарий, который имеет следующую строку в текстовом файле (он называется test.txt и помещается в ту же папку, что и исполняемый файл):

H235 Sportello_dx N246 15:20:43 15:27:55

Однако вывод программы такой:

product_t code_product: ��)�� 
product_t name:  
product_t code_piece: N246 
product_t enter: 15:20:43 
product_t exit: 15:27:55 

. Вот пастбина со всем кодом, готовым к запуску: https://pastebin.com/9rz0vM5G

почемуЯ получаю этот странный вывод для первых 2 строк, но остальные работают?

1 Ответ

0 голосов
/ 05 июня 2018

strtok () изменяет строку во время ее анализа и возвращает указатели внутри этой же строки, в вашем случае line.Поэтому, когда вы позже free(line) освобождаете память, ссылки на структуру temp.Исследования strdup().

...