2013-05-12 90 views
0

我想使用fgets而不是fscanf来获取stdin并通过管道将其发送给子进程。下面的代码工作排序的文件中的行但如何使用fgets()而不是fscanf()在标准输入C中?

fgets(word, 5000, stdin) 

更换

fscanf(stdin, "%s", word) 

给我的警告

warning: comparison between pointer and integer [enabled by default] 

否则程序似乎工作。任何想法,为什么我得到警告?

int main(int argc, char *argv[]) 
{ 
    pid_t sortPid; 
    int status; 
    FILE *writeToChild; 
    char word[5000]; 
    int count = 1; 

    int sortFds[2]; 
    pipe(sortFds); 

    switch (sortPid = fork()) { 
    case 0: //this is the child process 
     close(sortFds[1]); //close the write end of the pipe 
     dup(sortFds[0]); 
     close(sortFds[0]); 
     execl("/usr/bin/sort", "sort", (char *) 0); 
     perror("execl of sort failed"); 
     exit(EXIT_FAILURE); 
    case -1: //failure to fork case 
     perror("Could not create child"); 
     exit(EXIT_FAILURE); 
    default: //this is the parent process 
     close(sortFds[0]); //close the read end of the pipe 
     writeToChild = fdopen(sortFds[1], "w"); 
     break; 
    } 

    if (writeToChild != 0) { //do this if you are the parent 
    while (fscanf(stdin, "%s", word) != EOF) { 
     fprintf(writeToChild, "%s %d\n", word, count); 
    } 
    } 

    fclose(writeToChild); 

    wait(&status); 

    return 0; 
} 

回答

3

的fscanf返回int,FGETS一个char *。由于EOF为int,因此与EOF的比较会导致char *的警告。

fgets在EOF或错误上返回NULL,所以检查一下。

1

fgets原型为:

字符*与fgets(字符* STR,INT NUM,FILE *流);

与fgets将读取换行符到您的字符串,因此,如果你使用它,你的代码的一部分,可以作为写:

if (writeToChild != 0){ 
    while (fgets(word, sizeof(word), stdin) != NULL){ 
     count = strlen(word); 
     word[--count] = '\0'; //discard the newline character 
     fprintf(writeToChild, "%s %d\n", word, count); 
    } 
} 
相关问题