Bonjour à tous.
C'est mon premier poste ici, alors j'en profite pour tous vous saluer.
Afin de me perfectionner un peu en C#, je voudrais écrire un clone de l'outil Unix "grep".
http://pwet.fr/man/linux/commandes/grep
J'ai commencé à coder, et tout va bien, il fonctionne à merveille.
Seulement, en ligne de commande, on peut avoir plusieurs sources pour le System.In
1/ Si on ne fait rien de spécial, c'est le clavier
2/ Si on indique un paramètre : "grep test 0<c:\in\texte.txt" c'est alors le fichier "c:\in\texte.txt" qui est utilisé à la place du clavier
3/ Si on utilise le pipe après une autre commande, c'est la sortie de la commande précédente : "dir *.* | grep test"
Tout ça, c'est bien joli.
Le grep fonctionne en général avec le |, mais il est impossible d'être sûr que l'utilisateur va toujours utiliser ce système, et ne va pas l'utiliser sans paramètre et taper au clavier (pour tester les paramètres par exemple).
Dans ce cas, ma boucle se termine à la première ligne saisie. Moi, je voudrais que ça continue à accepter des lignes jusqu'à ce que l'utilisateur frappe une certaine séquence (ctrl+c par exemple).
Voici mon code :
Une idée pour détecter proprement si je suis en mode console ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 static void Main(string[] args) { GrepArguments Args = new GrepArguments(args); int Count = 0; if (Args.Motif.Length == 0) { Console.Error.WriteLine("Une erreur s'est produite : vous n'avez pas spécifié de critère de recherche."); Environment.ExitCode = 1; return; } /*...*/ while (Console.In.Peek() > -1) // Ici mon test est false quand je suis en mode "clavier" et que j'ai tapé ma première ligne { string line = Console.In.ReadLine(); StringComparison sc; if (Args.IgnoreCase) { sc = StringComparison.CurrentCultureIgnoreCase; } else { sc = StringComparison.CurrentCulture; } int indexOf = line.IndexOf(Args.Motif, sc); if ( (!Args.InvertMatch && indexOf > -1) || (Args.InvertMatch && indexOf == -1) ) { Count++; if (!Args.Count) { if (!Args.DisplayOnlyMatching) { Console.Out.WriteLine(line); } else { Console.Out.WriteLine(line.Substring(indexOf, Args.Motif.Length)); } } } } if (Args.Count) { Console.Out.WriteLine(Count.ToString()); } Environment.ExitCode = 0; }
Partager