首页 > 解决方案 > 使用 strtok 从文件中获取输入

问题描述

我正在尝试创建一个程序,该程序从文件中接收多个进程(名称、开始时间、剩余时间),然后使用循环算法来处理队列。

问题是,当我尝试使用strtok()and标记文件的每一行时fgets(),进程的名称总是错误的。

例如,如果第一行是P1 0 3输出是这样的:

图片

void RoundRobin(char *filename) {
    Queue *q = initQueue();
    char string[MAX_SIZE];
    FILE *file;
    Process process[20];
    char *token;
    file = fopen(filename, "r");
    if (!file) {
        printf("File Cannot Be Opened");
    }
    fgets(string, 150, file);
    token = strtok(string, "=");
    token = strtok(NULL, "+");
    int time_quantum = atoi(token);
    int process_count = 0;
    while (fgets(string, 150, file)) {
        char *token1;
        token1 = strtok(string, " ");
        process[process_count].name = token1;

        token1 = strtok(NULL, " ");
        process[process_count].starting_time = atoi(token1);

        token1 = strtok(NULL, " ");
        process[process_count++].remaining_time = atoi(token1);
        token1 = strtok(NULL, " ");
    }

    for (int i = 0; i < process_count; i++) {
        printf("%s  %d  %d\n", process[i].name, process[i].starting_time, process[i].remaining_time);
    }

    fclose(file);
}

标签: cstringstrtok

解决方案


char[]您正在为所有令牌解析重用一个。每次fgets()都会覆盖 that 的内容,并返回指向 that 内部内存的指针。因此,每次从文件中读取新行时,已经存储在数组中的先前指针仍指向同一内存,但该内存的内容已更改。char[]strtok()char[]process[]

相反,您需要为要保存在数组中的char[]每个字符串分配一个单独的字符串。您可以使用它,例如:nameprocess[]strdup()

while (fgets(string, 150, file)){
    char* token1 token1 = strtok(string, " ");
    process[process_count].name = strdup(token1); // <-- HERE

    ...
}

// use process[] as needed...

for(int i = 0; i < process_count; i++){
    free(process[i].name);
}

推荐阅读