我有一个程序,我需要读取几个管道的内容,比较单词,打印最小的单词,从该管道中获取一个新单词(仅限该管道),再次进行比较,直到所有管道都为空。< / p>
我有几个问题:
1:出于某种原因,我只能从一根烟斗中读取。当试图从其他人那里读取时,它一直没有给我任何东西,即使我将管道设置为其他任何一个,它只适用于那个管道。
基本上,我不能在我想要的时候让sortOutput切换到其他管道。
2:出于某种原因,我似乎无法检测到数组元素何时为空,因此它会比较&#34;&#34;到了这个词,&#34;&#34;总是更低。
据我所知,发生的事情是sortOutput被设置为最后一个管道,然后它继续从该管道而不是其他管道读取,或者如果被迫通过循环从其他管道读取则没有任何内容。我不确定为什么,但如果我将sortOutput显式设置为另一个管道(没有循环,全局声明),它将从任何其他管道中读取所有单词就好了。我认为它将sortOutput切换到导致问题的循环内的其他管道。奇怪的是,在设置初始单词数组时,将sortOutput切换到其他管道就可以了。作为一个注释,我必须使用fgets,我没有选择。
这里是抑制器的代码,我已经评论了我认为发生问题的地方:
//Suppressor - Reads one word from each pipe, compares, prints largest. Gets next word from that one pipe, compares, prints largest.
//Suppressor deletes duplicate words
//Reads from pipefds_two[count*2] position
char* words[numChildren];
int index, cont=1;
char* smallest;
int smallestIndex;
int checker;
int duplicateCount = 0;
int kindex;
char* temptwo;
int length;
int nullCount = 0;
int counter = 0;
FILE* sortOutput;
for(kindex = 0; kindex < numChildren; kindex++){ //Initializes array with beginning values
sortOutput = fdopen(pipefds_two[kindex*2], "r");
fgets(buffer, PIPE_BUF, sortOutput);
words[kindex] = strdup(buffer);
//fflush(sortOutput);
close(pipefds_two[(kindex*2)+1]);
}
while(counter < 13){ //This is where it prints out lowest values each "round", gets new words, and gets rid of duplicates
printf("\nCurrent words in array (0, 1, 2): %s %s %s", words[0], words[1], words[2]);
for(index = 0; index < numChildren; index++){
if(words[index] != NULL){ //Searches for first value in array that's not null to be "lowest" value
smallest = words[index];
smallestIndex = index;
printf("Found first non-null word: %s", smallest);
break;
}
}
printf("Suppressor WHILE \n");
nullCount = 0;
printf("smallest word assigned: %s ", smallest);
printf("smallest index %d\n", smallestIndex);
for(index = 0; index < numChildren; index++){ //need to loop through each pipe and pull a word, THEN compare them all!
printf("Suppressor FOR (index: %d word:%s)", index, words[index]);
if(words[index] == NULL){ //Fills in a NULL gap in the array with a new word from the corresponding pipe
bzero(buffer, PIPE_BUF);
sortOutput = fdopen(pipefds_two[index*2], "r"); //THIS IS PROBLEM! Here, or around here!
fgets(buffer, PIPE_BUF, sortOutput);
words[index] = strdup(buffer);
//fflush(sortOutput);
printf("the word which replaces a NULL: %s", buffer);
}
}
for(index = 0; index < numChildren; index++){ //COMPARE ALL VALUES NOW THAT IT IS POPULATED
printf("compare FOR loop index: %d\n", index);
if((index != numChildren) && (words[index] != NULL) && (index != smallestIndex)){
printf("IF statement, (current arrayWord: %s)(smallest: %s)", words[index], smallest);
checker = strcmp(smallest, words[index]);
//printf("checker\n");
if(checker > 0){
smallest = words[index];
smallestIndex = index;
printf("New smallest assigned: %s New Smallest Index: %d\n", smallest, smallestIndex);
}else if(checker == 0){
printf("Same word\n");
words[index] = NULL;
duplicateCount++;
}else{
printf("ArrayWord is larger, smallest staying the same\n");
}
} if(index == numChildren-1){ //reached the end of the list
printf("The smallest this round is: %s", smallest);
words[smallestIndex] = NULL;
}
}
for(index = 0; index < numChildren; index++){ //Check for removed words!
printf("Checking if entries are null in array: index %d\n", index);
if(words[index] == NULL){
nullCount++;
printf("words at index null num: %d\n", nullCount);
}
}
//check to see if everything is null
counter++;
}
我知道while循环只设置为13,但是当我运行它时它不是一个无限循环,可以看到发生了什么。
提前谢谢大家!
答案 0 :(得分:2)
问题是你多次fdopen
管道。第一次fdopen
管道并调用fgets
时,它会将管道的全部内容(或至少多行)吸入FILE
的内部缓冲区然后给你第一行。下次你fdopen
管道时,你将丢失所有被吸入第一个FILE
缓冲区的数据,当你忘记了{{1}的价值时,你已经忘记了这个数据。在第一次sortOutput
电话中返回的内容。
您需要做的是让fdopen
成为sortOutput
的数组,然后循环管道ONCE在每个管道上调用FILE *
并存储所有生成的fdopen
s在数组中。然后,稍后当您想要从管道中读取时,请从FILE *
开始阅读,而不是再次调用sortOutput[index]
。
另外,你说你想要阅读(和比较)单词,但你实际上是在阅读(和比较)行 - 包括它们的结尾换行符。只要你的输入行每行有一个单词而没有其他空格或标点符号,这就行了。
您还需要检查每个fgets的返回值以进行EOF并正确处理。