簡體   English   中英

使用 strtok 從文件中獲取輸入

[英]using strtok to get input from file

我正在嘗試創建一個程序,該程序從文件中接收多個進程(名稱、開始時間、剩余時間),然后使用循環算法來處理隊列。

問題是,當我嘗試使用strtok()fgets()標記文件的每一行時,進程的名稱總是錯誤的。

例如,如果第一行是P1 0 3 ,則 output 是這樣的:

圖片

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);
}

您正在為所有令牌解析重用單個char[] fgets()每次都會覆蓋該char[]的內容,而strtok()將返回指向該char[]內部 memory 的指針。 因此,每次從文件中讀取新行時,您已經存儲在process[]數組中的先前指針仍然指向相同的 memory,但該 memory 的內容已被更改。

您需要為要保存在process[]數組中的每個name分配一個單獨的char[]字符串。 您可以為此使用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);
}

問題是strtok()返回指向它解析的行的指針。 因此, process數組中的所有條目都指向通過調用fgets()修改的同一個string數組。

您必須復制存儲在流程描述結構中的字符串:

void RoundRobin(const char *filename) {
    char string[MAX_SIZE];
    Process process[20];
    Queue *q = initQueue();
    char *token;
    FILE *file;
    file = fopen(filename, "r");
    if (!file) {
        printf("Cannot open file %s\n", filename);
        return;
    }
    int time_quantum = 0;
    int process_count = 0;

    if (fgets(string, sizeof string, file)
    &&  (token = strtok(string, "=")) != NULL
    &&  (token = strtok(NULL, "+")) != NULL) {
        time_quantum = atoi(token);
    }
    while (fgets(string, sizeof string, file)) {
        char *token1;

        if ((token1 = strtok(string, " ")) == NULL)
            contine;
        process[process_count].name = strdup(token1);

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM