我在做什么 -
我正在尝试读取包含进程信息的文件,并创建3个不同的数组。一个用于数组名称,第二个用于到达时间,第三个用于处理时间,然后计算它。进程数量并不固定,但出于测试目的,我将其保留为4个进程。
第一条printf线输出我想要的东西。文件内容采用数组形式。
void readFile() {
int i = 0;
char printLine[10];
char *processName[4];
char *arrivalTime[4];
char *processTime[4];
FILE *processFile = fopen("processes.txt", "r");
while(!feof(processFile)){
fgets(printLine, 10, processFile); // get the line
processName[i] = strtok(printLine, " ");
arrivalTime[i] = strtok(NULL, " ");
processTime[i] = strtok(NULL, "");
printf("%s %s %s\n", processName[i], arrivalTime[i], processTime[i]);
i++;
}
printf("----\n%s %s %s\n", processName[0], arrivalTime[0], processTime[0]);
}
错误 - 错误(种类)是即使打印第1个元素(第1个处理)信息,第2个打印行的输出也给出了最后的处理信息。因此,不是打印第一个元素,而是打印最后一个元素。
processes.txt文件如下所示
P1 0 3
P2 1 6
P3 4 4
P4 6 2
P.S。 此文件的格式将被修复,因此没有问题。
我是一个真正的新手。请原谅我的愚蠢。
编辑 - 我的输出
答案 0 :(得分:1)
这是因为strtok
的工作方式,它不返回指向令牌副本的指针,它返回指向ORIGINAL位置中令牌的第一个字符的指针。你需要自己创建一个副本。
基本上,在第一次阅读后你会遇到以下情况:
[1 ^ 'P'
,'1'
,'\0'
,2 ^ '0'
,'\0'
,3 ^ '3'
,{{1} }]
1:'\0'
,printLine
2:processName[0]
3:arrivalTime[0]
所以processTime[0]
和printLine
只是指向第一个位置 - 标记为1 ^ - 。
processName[0]
正指向第4个位置 - 标记为2 ^ - 。
arrivalTime[0]
只是指向第3个位置 - 标记为3 ^ - 。基本上你所有的“字符串” - 实际上只是字符指针 - 指向同一字符序列中的不同点。 当您读取新字符串时,它会覆盖旧数据,但指针会保留在原来的位置。
循环完成后,您会遇到以下情况:
[1 ^ processTime[0]
,'P'
,'4'
,2 ^ '\0'
,'6'
,3 ^ '\0'
,{{1} }]
1:'2'
,'\0'
,printLine
,processName[0]
,processName[1]
2:processName[2]
,processName[3]
,arrivalTime[0]
,arrivalTime[1]
3:arrivalTime[2]
,arrivalTime[3]
,processTime[0]
,processTime[1]
正如您所看到的,一切都只是指向相同字符序列中的不同位置。