Introduction

Introduction

Avec cette partie de notre article C de développement C sur Linux, nous nous préparons à sortir de la zone théorique et à entrer dans la vraie vie. Si vous avez suivi la série jusqu'à ce point et que vous avez essayé de résoudre tous les exercices, vous aurez maintenant une idée de ce qu'est C, vous devez donc sortir dans la nature et faire des trucs pratiques, sans quelle théorie n'a pas beaucoup de valeur. Certains des concepts que vous verrez ci-dessous sont déjà connus, mais ils sont extrêmement importants pour tout programme C sur n'importe quel système d'exploitation de type Unix. Oui, l'information est valable quel que soit le système d'exploitation, tant que c'est une sorte d'Unix, mais si vous tomberez sur quelque chose de spécifique à Linux, vous saurez. Nous traiterons des concepts tels que la saisie, la sortie et l'erreur standard, en profondeur printf () et l'accès au fichier, entre autres.

E / S de base

Avant d'aller plus loin, prenons un peu de temps et voyons de quoi parle cette E / S. Comme beaucoup d'entre vous le savent, le terme représente l'entrée / sortie et a un sens large, mais dans notre cas, nous nous intéressons à la façon d'imprimer des messages à la console et à la façon d'obtenir des commentaires de l'utilisateur, ainsi que des sujets plus avancés dans le même veine. La bibliothèque C standard définit une série de fonctions pour cela, comme vous le verrez, et après avoir lu un peu, vous remarquerez que vous aurez assez difficile de vivre sans, à moins que vous ne vouliez réécrire lesdites fonctions pour le plaisir. Il vaut mieux dès le début que les installations dont ce matériel parle ne fait pas partie de la langue C en soi; Comme je l'ai dit, la bibliothèque C standard leur offre.

E / S standard

En bref, le sous-titre ci-dessus signifie «obtenir des entrées de l'utilisateur, imprimer les caractères sur les erreurs de sortie standard et d'impression sur l'erreur standard». De nos jours, la principale source d'entrée, au moins à ce niveau, est le clavier, et l'appareil sur lequel le système imprime est l'écran, mais les choses n'étaient pas toujours comme ça. L'entrée a été faite sur les télétypes (en passant, le nom de l'appareil en provient), et le processus était lent et maladroit. Tout système de type Unix a encore des restes historiques concernant, mais pas seulement les E / S, mais pour le reste de cet article, nous traiterons Stdin comme le clavier et le stdout / stderr comme écran. Vous savez que vous pouvez rediriger vers un fichier, en utilisant l'opérateur '>' offert par votre shell, mais nous ne nous intéressons pas à cela pour le moment. Avant de commencer l'article enfin, un petit rappel: Mac OS jusqu'à la version 9 a des fonctionnalités uniques concernant notre sujet qui m'a poussé à lire une documentation avant de commencer le développement dessus. Par exemple, sur tous les systèmes UNIX (comme), la touche Entrée génère un LF (alimentation en ligne). Sur Windows, c'est CR / LF, et sur Apple jusqu'à Mac OS 9, c'est CR. En bref, chaque vendeur Unix commercial a essayé de rendre leur OSS «unique» en ajoutant des fonctionnalités. En parlant de documentation, les pages manuelles de votre système s'avéreront inestimables, bien que peut-être arides parfois, et aussi un bon livre sur Unix Design sera bon à vos côtés.

Nous avons vu printf () dans nos épisodes précédents et comment imprimer du texte à l'écran. Nous avons également vu ScanF () comme un moyen d'obtenir du texte de l'utilisateur. Pour les caractères uniques, vous pouvez compter sur getchar () et putchar (). Nous verrons maintenant quelques fonctions utiles des en-têtes inclus dans la bibliothèque standard. Le premier en-tête dont nous parlerons est ctype.H, et il contient des fonctions utiles pour vérifier le cas d'un caractère ou le modifier. N'oubliez pas que chaque en-tête standard a une page manuelle, expliquant quelles fonctions sont disponibles, et lesdites fonctions ont à leur tour des pages d'homme, détaillant les types de retour, les arguments, etc. Voici un exemple qui convertit chaque caractère d'une chaîne en minuscules, en utilisant Tolower (). Comment atteignez-vous le contraire?

#include #include int main () int c; / * le personnage lu * / alors que ((c = getchar ()) != Eof) putchar (tolower (c)); retour 0;  

Une autre question pour vous est: de quelle manière le code doit être modifié afin qu'il imprime le résultat bas uniquement après une phrase? C'est-à-dire à condition que la phrase soit toujours terminée par un point et un espace.

printf () en détail

Comme il s'agit d'une fonction si largement utilisée, je pensais seulement qu'elle méritait une sous-section de sa propre. printf () accepte les arguments préfixés avec le symbole «%» et suivi d'une lettre (ou plus), lui disant ainsi quel type d'entrée il devrait s'attendre. Nous avons déjà travaillé avec «% D», qui signifie Decimal, ce qui est approprié lorsque vous travaillez avec des entiers. Voici une liste plus complète des spécificateurs de format de printf ():

  • D, i - entier
  • O - octal, sans le préfixant zéro
  • x, x - hexadécimal, sans la préfixe 0x
  • u - unsigned int
  • c - char
  • S - String, char *
  • f, e, e, g, g, - float - vérifiez le manuel printf () de votre système
  • P - pointeur, void *, dépendant de l'implémentation, norme entre les distros Linux

Je vous recommande fortement de prendre le temps de jouer avec ces spécificateurs, et le fait que je n'ai pas eu plus de détails comme la précision est parce que vous devrez faire de la lecture par vous-même. Pendant que vous y êtes, portez une attention particulière à la partie de la liste des arguments variables, et notez que Linux a une commande nommée Printf, dans le cadre de Coreutils, alors assurez-vous d'utiliser la page de section 3 (spécifique à Linux, comme d'autres unices peut avoir les sections manuelles disposées différemment).

Scanf () est l'opposé de printf, en ce qu'il prend les entrées de l'utilisateur au lieu de sortir à l'utilisateur. Les spécificateurs de format sont presque les mêmes, à certaines exceptions concernant les flotteurs et le fait qu'il n'a pas de% P. Pourquoi pensez-vous que c'est? Il prend également en charge les listes d'arguments variables, tout comme printf ().

Accès au dossier

Il s'agit d'une autre partie essentielle des E / S et puisque C est relativement bas, il vous permet de lire et d'écrire des fichiers sur le disque de manière simple. L'en-tête qui offre cette fonctionnalité simple est stdio.H, et la fonction que vous utiliserez est fopen (). Il prend le nom de fichier comme argument, ainsi que le mode qu'il doit être lu (lire / écrire (r, w). Annexe (a) ou binaire (b), par opposition au texte - mais la mise en œuvre de ce dernier dépend du système). fopen () renvoie un pointeur de fichiers, qui est un type. Avant tout, vous aurez besoin d'un pointeur de fichier, comme illustré:

Fichier * fp; / * pointeur de fichier * / fp = fopen ("/ home / user / testfile.txt "," w "); fprintf (fp," mon fichier de test.")

Simple: j'ai ouvert un fichier sur mon disque et je lui ai écrit la chaîne "mon fichier de test". Vous avez peut-être deviné, j'ai quelques exercices. Cela ferait-il une différence si le fichier existe ou non? Et s'il existait, mais était vide? Dois-je avoir utilisé une annexe au lieu du mode d'écriture? Pourquoi?

Après avoir utilisé le fichier, il faut Ferme le. C'est important, car en fermant votre programme indique au système d'exploitation «Hé, j'ai fini avec ce fichier. Fermez tous les tampons sales et écrivez mon fichier sur disque de manière civilisée, donc aucune perte de données ne se produit ».

fclose (FP);

Voici un exemple réel de l'utilisation des E / S de fichiers du programme Yest de Kimball Hawkins, qui nous aide à nous souvenir de deux choses: une, qu'en raison de la conception UNIX (tout est un fichier), STDIN, STDOUT et STDDERR sont des fichiers, donc ils Peut être utilisé avec des fonctions d'E / S de fichiers, et deux, que la partie suivante traite STDERR et sort.

void store_time ()  si (time_ok == false) retour; / * Pas d'informations de temps, les sauter * / /* Heure */ si (tfield [0]> 24) fprintf (stderr, "Erreur: mauvaise entrée heure: '% d' \ n", tfield [0]); sortie (1);  thetime-> tm_hour = tfield [0]; /* Minute */ si (tfield [1]> 0)  si (tfield [1]> 60) fprintf (stderr, "Erreur: mauvaise entrée minute: '% d' \ n", tfield [1]); sortie (1);  thetime-> tm_min = tfield [1]; 

Traiter les erreurs avec Stderr et sortir

Votre programme doit avoir un moyen de gérer les erreurs et de faire savoir au système d'exploitation et à l'utilisateur que quelque chose a mal tourné. Bien que cette partie ne soit en aucun cas une thèse sur la façon de traiter vos situations possibles en C, elle traite d'un élément très utile et bien pensé d'UNIX: les erreurs de sortie à un autre endroit, différente de STDIN, afin que l'utilisateur puisse séparer le deux lors de la débogage de la question. Utilisez également les codes de sortie afin que l'utilisateur sache quand le programme s'est terminé avec succès et quand il ne l'a pas fait. C'est pourquoi Stderr existe, pour la première partie, et c'est pourquoi Exit () existe également, pour la deuxième partie. Le lecteur astucieux a déjà obtenu l'idée de l'échantillon de code ci-dessus, donc tout ce qu'il faut, c'est de dire au système de ne pas sortir de texte sur la sortie par défaut / standard, mais au «canal» spécial qui existe en particulier pour cela. En ce qui concerne la sortie (), cela fonctionne comme ceci: zéro pour le succès, toute autre valeur entre 1 et 255 en cas d'échec. Il est inclus dans stdlib.H et ne renvoie pas de valeur. C'est à vous, comme vous pouvez le voir dans le code de Kimball ci-dessus, pour dire à la sortie s'il y a un problème, il peut donc informer la fonction parentale sur le statut de sortie.

En-têtes utiles

Inutile de dire que la connaissance de la bibliothèque C standard est obligatoire si vous voulez devenir sérieux avec le développement C sur Linux. Voici donc quelques autres en-têtes qui proposent des installations liées aux E / S et plus:

chaîne.H

Cet en-tête s'avérera très utile lorsque vous travaillez avec les conversions de chaînes (strTo * ()), la comparaison des chaînes (strcmp ()) ou la vérification de la longueur d'une chaîne (strlen ()).

ctype.H

Outre la conversion de cas, ctype.H offre des fonctions qui vérifient diverses propriétés de caractères. Certains d'entre eux sont Isalnum (), Isupper (), Isalpha () ou Isspace (), et vous êtes invité à deviner ce qu'ils font et comment ils fonctionnent.

mathématiques.H

De nombreuses fonctions nécessaires pour plus que les quatre opérations arithmétiques de base se trouvent ici, y compris Sin (), Cos () ou Exp ().

Dès la lecture

Les lecteurs les plus expérimentés me cloueront sur la croix pour ne pas traiter des sujets plus avancés comme malloc () ou size_t. Comme je l'ai dit à plusieurs reprises, cette série n'est pas destinée à un livre en ligne Know-tout pour le développement C (il n'y a rien de tel, de toute façon), mais plutôt un bon point de départ pour les débutants. Je pense que le futur développeur C doit être relativement bien versé dans les pointeurs et le fonctionnement de l'allocation de la mémoire avant qu'il ne commence à faire des cauchemars malloc (). Après la fin de cette série, il est recommandé d'obtenir un livre en profondeur sur C, après avoir demandé quelques opinions aux anciens (pas h.P. Les anciens de Lovecraft, j'espère), donc vous évitez les informations fausses ou trompeuses. Alors que vous connaissez Free () et Malloc () jusqu'à ce que nous terminions, il est probablement préférable d'obtenir un livre imprimé et de dormir avec sous votre oreiller.

Conclusion

L'article qui suivra celui-ci sera un peu plus long, car nous approfondirons la programmation Unix Way of C, mais une bonne compréhension de ce qui a été dit ici est recommandé pour que les prochaines étapes soient aussi lisses que possible.

  • je. C Développement sur Linux - Introduction
  • Ii. Comparaison entre C et d'autres langages de programmation
  • III. Types, opérateurs, variables
  • Iv. Contrôle de flux
  • V. Les fonctions
  • Vi. Pointeurs et tableaux
  • Vii. Structure
  • Viii. E / S de base
  • Ix. Style de codage et recommandations
  • X. Construire un programme
  • Xi. Emballage pour Debian et Fedora
  • Xii. Obtenir un forfait dans les référentiels officiels Debian

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Comment définir une zone de tout le monde personnalisé
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Masterring Bash Script Loops
  • Téléchargement Linux
  • Choses à faire après l'installation d'Ubuntu 22.04 Jammy Jellyfish…
  • Ubuntu 20.04 Guide
  • Installez Arch Linux dans VMware Workstation