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 deargv
est 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).