Mode
Slides
Presentation
Remote control
Send
Listen
Press F11 to switch to fullscreen.
C: Cours 8
1
paramètres
2
argc, argv
3
série d'images
4
find
5
python
6
make
7
make
8
make
9
readdir
10
*.jpg
11
> resultats.txt
12
> resultats.txt
13
> resultats.txt
14
cat, head, tail
15
grep
16
sort, cut, uniq, diff
17
Pipe
18
TAB
19
Semaine 8
Ligne de commande,
arguments, redirection, pipes
SSIE Programmation en C, Thomas Lochmatter, 2019
1

Passer des paramètres au programme

$$ ./projet simplon/1572464897.jpg 155.3
argv[0] argv[1] argv[2] argv[3]
./projet simplon/1572464897.jpg 155.3 NULL
Chaque paramètre est une chaine de caractères, mais le programme peut l'interpréter comme il veut.
2

Lire les paramètres

	// HIDE
	#include <stdio.h>
	#include <stdlib.h>

	// SHOW
	int main(int argc, char * argv[]) {
		// Vérifier le nombre de paramètres
		if (argc != 3) {
			printf("Utilisation:\n");
			printf("./projet FICHIER SEUIL\n");
			return 1;
		}

		// Lire les paramètres
		char * fichier = argv[1];
		double seuil = atof(argv[2]);
		...

		return 0;
	}
argv[0] ./projet
argv[1] simplon/1572464897.jpg
argv[2] 155.3
argv[3] NULL
Lecture plus sophistiquée des paramètres: getopt, ou getopt_long.
3

Traiter plusieurs images

		$$ ./projet simplon/1572327241.jpg
		bleu  jour

		$$ ./projet simplon/1572431641.jpg
		gris  jour

		$$ ./projet simplon/1572492841.jpg
		gris  nuit

		$$ ...
	
4

Traiter plusieurs images — find

Afficher les images (*.jpg) du répertoire simplon:

$$ find simplon -name '*.jpg'

Lancer ./projet pour chaque image:

$$ find simplon -name '*.jpg' -exec ./projet {} \;
Correspond à
		$$ ./projet simplon/1572327241.jpg
		$$ ./projet simplon/1572431641.jpg
		$$ ./projet simplon/1572492841.jpg
		$$ ...
	
A chaque itération, {} est replacé par le nom du fichier.
5

Traiter plusieurs images — Python

import os, subprocess

for image in os.listdir('simplon'):
    print(image)
    subprocess.call(['./projet', 'simplon/' + image]);
import os

for image in os.listdir('simplon'):
    print(image)
    fSource = 'simplon/' + image
    fResultat = 'resultat/' + image + '.txt'
    exitCode = os.system('./projet ' + fSource + ' > ' + fResultat);
    if exitCode != 0: break
6

Traiter plusieurs images — make

IMAGES = $(wildcard simplon/*.jpg)
RESULTATS = $(patsubst simplon/%.jpg, resultats/%.txt, $(IMAGES))

resultats/%.txt: simplon/%.jpg
	./projet $< > $@

all: $(RESULTATS)
		# Traiter une image
		$$ make resultats/1572492841.txt

		# Traiter toutes les images
		$$ make all
	
Dans un Makefile à part, ou comme règles supplémentaires dans le Makefile du projet.
7
Traiter plusieurs images — make 1570811641.jpg 1570815242.jpg 1572536041.jpg ... simplon/ 1570811641.txt 1570815242.txt 1572536041.txt ... resultats/ ./projet ./projet ./projet all
8

Traiter plusieurs images — make

Syntaxe horrible! Mais:
Description d'une chaine de traitement.
Détecte les changements.
Détecte les fichiers ajoutés ou modifiés. Peut être interrompu et relancé.
Exécution parallèle possible.
$$ make -j 4 all
9

Traiter plusieurs images — C

		// HIDE
		#include <stdio.h>
		#include <stdlib.h>
		#include <dirent.h>

		// SHOW
		DIR * repertoire = opendir("simplon");
		if (repertoire == NULL) ...

		while (1) {
			struct dirent * fichier = readdir(repertoire);
			if (fichier == NULL) break;
			if (fichier->d_type != DT_REG) continue;

			char cheminComplet[1000];
			sprintf(cheminComplet, "simplon/%s", fichier->d_name);
			traiterImage(cheminComplet);
		}

		closedir(repertoire);
	
10

Traiter plusieurs images — *.jpg

		// HIDE
		#include <stdio.h>
		#include <stdlib.h>

		// SHOW
		void traiterImage(char * fichier) {	...	}

		int main(int argc, char * argv[]) {
			for (int i = 1; i < argc; i++) {
				traiterImage(argv[i]);
			}

			return 0;
		}
	
$$ ./projet simplon/*.jpg
Correspond à
$$ ./projet simplon/1572327241.jpg simplon/1572431641.jpg ...
Glob sur Wikipedia
11

Rediriger la sortie

	$$ ./projet simplon/*.jpg
	simplon/1570930441.jpg  gris  nuit
	simplon/1571092441.jpg  gris  nuit
	simplon/1570840441.jpg  gris  nuit
	simplon/1570948441.jpg  bleu  jour
	simplon/1571128441.jpg  gris  jour
	...

	# Rediriger la sortie (STDOUT) dans un fichier
	$$ ./projet simplon/*.jpg > resultats.txt
Redirection sur Wikipedia — Bash redirections
12
./projet stdin stdout stderr printf(...) Terminal Terminal Terminal resultats.txt > resultats.txt
13

resultats.txt

	simplon/1570930441.jpg  gris  nuit
	simplon/1571092441.jpg  gris  nuit
	simplon/1570840441.jpg  gris  nuit
	simplon/1570948441.jpg  bleu  jour
	simplon/1571128441.jpg  gris  jour
	simplon/1571164441.jpg  gris  nuit
	simplon/1571182441.jpg  gris  nuit
	simplon/1571056441.jpg  bleu  jour
	simplon/1570912441.jpg  gris  nuit
	simplon/1571038441.jpg  gris  jour
	simplon/1570876441.jpg  bleu  jour
	simplon/1570822441.jpg  gris  nuit
	...
14

Fichiers texte: afficher

	# Afficher le fichier entier
	$$ cat resultats.txt

	# Compter le nombre de lignes, mots, et caractères
	$$ wc resultats.txt

	# Afficher les 20 premières lignes
	$$ head -n 20 resultats.txt

	# Afficher les 20 dernières lignes
	$$ tail -n 20 resultats.txt

	# "Suivre" un fichier qui est un train d'être écrit
	$$ tail -f resultats.txt
15

Fichiers texte: filtrer

	# Afficher les lignes qui contiennent "bleu"
	$$ grep bleu resultats.txt

	# Compter ces lignes
	$$ grep bleu resultats.txt | wc

	# Afficher les lignes qui ne contiennent pas "bleu"
	$$ grep -v bleu resultats.txt

	# Filtrer avec une expression régulière
	$$ grep -P '(bleu|gris)\s+[^n]' resultats.txt
Regular expression sur Wikipedia. regex101.com pour tester des expressions.
16

Fichiers texte: trier et différences

	# Trier (numérique: -n, unique: -u)
	$$ sort resultats.txt

	# Histogramme des valeurs
	$$ cut -f 2,3 resultats.txt | sort | uniq -c

	# Afficher les différences entre deux fichiers
	$$ diff resultats-maintenant.txt resultats-avant.txt
17
cut -f 2,3 resultats.txt stdin stdout stderr Terminal sort uniq -c stdout stdin stdout stdin Terminal gris nuitbleu jourgris jour... bleu jourbleu jourbleu jour... 6 bleu jour 4 gris jour10 gris nuit fh resultats.txt stderr stderr
18

Ligne de commande

Commande précédente / suivante dans l'historique des commandes
TAB
Auto-complétion des commandes, fichiers, répertoires, et parfois des options des commandes
Middle click
Insérer le texte sélectionné
19