Разбор текстового файла с разными типами в C - PullRequest
0 голосов
/ 02 августа 2020

У меня проблемы при разборе текстового файла. Каждая строка текста имеет имя, за которым следует три значения с плавающей запятой. Все они разделены пробелом. Я хочу сохранить имя в строке, а числа в массиве. Я знаю, что мне нужно читать каждую строку, используя fgets, а затем strtok, но дело в том, что я не понимаю, как работает strtok. Должен ли я звонить в strtok четыре раза? Как мне присвоить каждую «часть» моим переменным? Спасибо за уделенное время!

1 Ответ

0 голосов
/ 02 августа 2020

strtok будет искать указанные токены в строке. Вы должны вызывать его до тех пор, пока он не вернет NULL.

char *strtok(char *str, const char *delim)

Первый вызов выполняется с передачей строки (char *) в качестве аргумента str, а оставшееся время выполняется с передачей NULL, так как это определит что он должен продолжать поиск следующего токена с этого момента.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char line[] = "name 1.45 2.55 3.65";

    char* name;
    double values[3] = { 0 };
    char* ptr = NULL;
    int i = 0;

    ptr = strtok(line, " "); // Search for the first whitespace

    if (ptr != NULL) // Whitespace found
    {
        /* 'line' is now a string with all the text until the whitespace,
           with terminating null character */

        name = calloc(1, strlen(line));
        strcpy(name, line);

        while ((i < 3) && (ptr != NULL))
        {
            ptr = strtok(NULL, " "); // Call 'strtok' with NULL to continue until the next whitespace
            
            if (ptr != NULL) // Whitespace found
            {
                /* 'ptr' has now the text from the previous token to the found whitespace,
                   with terminating null character */
                   
                values[i] = atof(ptr); // Convert to double
            }
            i++;
        }
    }

    printf("%s %lf %lf %lf\n", name, values[0], values[1], values[2]);
}
...