2010-04-16 39 views
0

我想在bash shell中编写我自己的字数统计代码。
我做了平常的方法。但是我想用管道的输出来统计这个词。
因此,例如第一个命令是猫,我正在重定向到一个名为med的文件。
现在我必须使用'dup2'函数来计算该文件中的单词。我怎样才能为我的wc编写代码?如何实现字数bash shell

这是我的外壳PGM代码:

void process(char* cmd[], int arg_count) 
{  
    pid_t pid; 
    pid = fork(); 
    char path[81]; 
    getcwd(path,81); 
    strcat(path,"/"); 
    strcat(path,cmd[0]); 
    if(pid < 0) 
    { 
     cout << "Fork Failed" << endl; 
     exit(-1); 
    } 
    else if(pid == 0) 
    { 
     int fd; 
     fd =open("med", O_RDONLY); 
     dup2(fd ,0); 
      execvp(path, cmd); 
    } 
     else 
     { 
     wait(NULL); 
    } 
} 

我的单词计数是:

int main(int argc, char *argv[]) 
{ 
    char ch; 
    int count = 0; 
    ifstream infile(argv[1]); 
    while(!infile.eof()) 
    { 
     infile.get(ch); 
     if(ch == ' ') 
     { 
      count++; 
     } 
    } 
    return 0; 
} 

我不知道该怎么做输入重定向 我希望我的代码来做到这一点: 当我只在我的shell实现中输入wordcount时,我希望它在默认情况下计算med文件中的单词。 在此先感谢

+1

这听起来像是家庭作业。考虑添加“家庭作业”标签。 – 2010-04-16 17:14:26

回答

4

为什么不使用wc(字数)程序?只需将您的输出输出到wc -w即可完成。

2

您的字数统计程序始终使用argv[1]作为输入文件。如果您想支持从stdin或给定文件读取数据,则需要根据提供给您的程序的参数数量来更改用于输入的内容。

std::streambuf* buf; 
std::ifstream infile; 
if (argc > 1) 
{ 
    // Received an argument, so use it as a source file 
    infile.open(argv[1]); 
    if (!infile) 
    { 
     perror("open"); 
     return 1; 
    } 
    buf = infile.rdbuf(); 
} 
else 
{ 
    // No arguments so use stdin 
    buf = std::cin.rdbuf(); 
} 

std::istream input(buf); 
while (!input.eof()) 
{ 
    ... 
} 
...