как реализовать подсчет слов в bash shell - PullRequest
0 голосов
/ 16 апреля 2010

Я пытаюсь написать свой собственный код для подсчета слов в оболочке bash.
Я сделал обычным способом. Но я хочу использовать вывод трубы, чтобы посчитать слово.
Так, например, первая команда - это cat, и я перенаправляю в файл с именем med.
Теперь я должен использовать функцию «dup2» для подсчета слов в этом файле. Как я могу написать код для моего туалета?

Это код для моей оболочки 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;  
}  

Я не знаю, как сделать перенаправление ввода я хочу, чтобы мой код сделал это: Когда я просто набираю wordcount в моей реализации оболочки, я хочу, чтобы он подсчитывал слова в файле med по умолчанию. Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 16 апреля 2010

Почему бы не использовать программу wc (количество слов)? Просто перенаправьте вывод на wc -w и все готово.

2 голосов
/ 16 апреля 2010

Ваша программа подсчета слов всегда использует argv[1] в качестве входного файла. Если вы хотите поддерживать чтение из стандартного ввода или заданного файла, вам нужно будет изменить то, что вы используете для ввода, исходя из количества аргументов, выданных вашей программе.

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())
{
    ...
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...