C 使用strtok从文件中获取输入

C 使用strtok从文件中获取输入,c,string,strtok,C,String,Strtok,我试图创建一个程序,从一个文件中接收多个进程(名称、开始时间、剩余时间),然后使用循环算法来处理队列 问题是,当我尝试使用strtok()和fgets()标记文件的每一行时,进程的名称总是错误的 例如,如果第一行是p103,则输出如下: void循环(char*filename){ Queue*q=initQueue(); 字符字符串[最大大小]; 文件*文件; 过程[20]; 字符*令牌; file=fopen(文件名为“r”); 如果(!文件){ printf(“无法打开文件”); } f

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

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

例如,如果第一行是
p103
,则输出如下:

void循环(char*filename){
Queue*q=initQueue();
字符字符串[最大大小];
文件*文件;
过程[20];
字符*令牌;
file=fopen(文件名为“r”);
如果(!文件){
printf(“无法打开文件”);
}
fgets(字符串,150,文件);
令牌=strtok(字符串,“=”);
令牌=strtok(空,“+”);
int time_quantum=atoi(令牌);
int进程计数=0;
while(fgets(字符串,150,文件)){
字符*1;
token1=strtok(字符串“”);
进程[进程计数].name=token1;
token1=strtok(NULL,“”);
进程[进程\计数]。开始\时间=atoi(令牌1);
token1=strtok(NULL,“”);
进程[进程计数+++]。剩余时间=atoi(令牌1);
token1=strtok(NULL,“”);
}
for(int i=0;i
您正在重用单个
字符[]
进行所有令牌解析
fgets()
将每次覆盖该
char[]
的内容,并且
strtok()
将返回指向该
char[]
中内存的指针。因此,每次从文件中读取新行时,先前存储在
进程[]
数组中的指针仍指向同一内存,但该内存的内容已被更改

您需要为要保存在
进程[]
数组中的每个
名称
分配一个单独的
字符[]
字符串。您可以为此使用
strdup()
,例如:

while(fgets(字符串,150,文件)){
char*token1-token1=strtok(字符串“”);

process[process_count].name=strdup(token1);//问题是
strtok()
返回一个指针到它解析的行中。因此
进程
数组中的所有条目都指向同一
字符串
数组,该数组通过调用
fgets()
进行修改

必须复制存储在流程描述结构中的字符串:

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);
}
void循环(const char*filename){
字符字符串[最大大小];
过程[20];
Queue*q=initQueue();
字符*令牌;
文件*文件;
file=fopen(文件名为“r”);
如果(!文件){
printf(“无法打开文件%s\n”,文件名);
返回;
}
int time_quantum=0;
int进程计数=0;
if(fgets(字符串、字符串大小、文件)
&&(token=strtok(字符串,“=”)!=NULL
&&(token=strtok(NULL,“+”)!=NULL){
时间\量子=atoi(令牌);
}
while(fgets(字符串、字符串大小、文件)){
字符*1;
if((token1=strtok(字符串“”)==NULL)
康丁;
进程[进程计数].name=strdup(令牌1);
if((token1=strtok(字符串“”)==NULL)
康丁;
进程[进程\计数]。开始\时间=atoi(令牌1);
if((token1=strtok(字符串“”)==NULL)
康丁;
进程[进程\计数]。剩余\时间=atoi(令牌1);
进程计数++;
}
for(int i=0;i
您可能需要阅读以下内容: