TP 9 : Réécriture de commandes du terminal 
Dans ce TP, on veut réécrire les fonctions classiques du terminal (revoir TP 6 et TP 7).
Pour cela, on va utiliser deux arguments pour la fonction main :
argv: tableau de chaîne de caractères (donc un tableau un tableaux, puisque une chaîne de caractères est un tableau). Le premier élément deargvest le nom du programme qui exécutemain.argc: taille deargv
Par exemple, voici comment on pourrait réécrire la commande echo du terminal (qui se contente d'afficher ses arguments) :
! cat echo/echo.c
#include <stdio.h>
int main(int argc, char* argv[]) {
for(int i = 1; i < argc; i++)
printf("%s ", argv[i]);
}
! gcc echo/echo.c -o echo/echo
! ./echo/echo hello world
hello world
cat¶
Exercice
Réécrire la commande cat, qui prend en argument un chemin de fichier et affiche son contenu.
On pourra lire 50 caractères par 50 caractères dans le fichier (fscanf(f, "%50s", s)).
! ./cat/cat cat/cat.c
./cat/cat#include<stdio.h>intmain(intargc,char*argv[]){printf("%s",argv[0]);FILE*f=fopen(argv[1],"r");chars[50];while(fscanf(f,"%50s",s)!=EOF)printf("%s",s);}
grep¶
Exercice
Réécrire une variante de grep, avec 2 paramètres (un mot dans un chemin de fichier) et qui affiche les positions où le mot apparaît dans le fichier.
!gcc grep/grep.c -o grep/grep
! ./grep/grep grep/grep.c
342#include<stdio.h>#include<stdlib.h>intmain(intargc,char*argv[]){FILE*f=fopen(argv[1],"r");intn=0;for(charc;fscanf(f,"%c",&c)!=EOF;n++);fclose(f);f=fopen(argv[1],"r");printf("%d",n);char*s=malloc(n*sizeof(char));while(fscanf(f,"%s",s)!=EOF)printf("%s",s);}
ls¶
Réécrire ls pour lister les fichiers dans le répertoire courant. On pourra utiliser getcwd et directory_iterator (qui est du C++ : il faut donc compiler avec g++ au lieu de gcc).