2010-04-16 7 views
0

J'essaie d'écrire mon propre code pour le nombre de mots dans bash shell.
J'ai fait de façon habituelle. Mais je veux utiliser la sortie de pipe pour compter le mot. Par exemple, par exemple, la 1ère commande est cat et je redirige vers un fichier appelé med.
Maintenant je dois utiliser la fonction 'dup2' pour compter les mots dans ce fichier. Comment puis-je écrire le code pour mon wc?comment implémenter le compte de mots bash shell

C'est le code de ma coquille 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); 
    } 
} 

Et mon wordcount est:

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; 
} 

Je ne sais pas comment faire la redirection d'entrée je veux que mon code pour le faire: Quand je tape juste wordcount dans mon implémentation shell, je veux qu'il compte les mots dans le fichier med par défaut. Merci d'avance

+1

Cela semble être des devoirs. Envisagez d'ajouter la balise "devoirs". –

Répondre

4

Pourquoi ne pas utiliser le programme wc (nombre de mots)? Il suffit de diriger votre sortie vers wc -w et vous avez terminé.

2

Votre programme de nombre de mots est toujours en utilisant argv[1] que le fichier d'entrée. Si vous voulez prendre en charge la lecture à partir de stdin ou d'un fichier donné, vous devez modifier ce que vous utilisez pour votre entrée en fonction du nombre d'arguments donnés à votre programme.

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()) 
{ 
    ... 
} 
... 
Questions connexes