Einführung

Einführung

Mit diesem Teil unserer C -Entwicklung über Linux -Artikel bereiten wir uns darauf vor, aus der theoretischen Zone herauszukommen und in das wirkliche Leben einzugeben. Wenn Sie der Serie bis zu diesem Zeitpunkt befolgt und versucht haben, alle Übungen zu lösen, werden Sie jetzt eine Vorstellung davon haben, worum es bei C geht. viel Wert. Einige der Konzepte, die Sie unten sehen werden, sind bereits bekannt, sind jedoch für jedes C-Programm in jedem UNIX-ähnlichen Betriebssystem äußerst wichtig. Ja, die Informationen sind unabhängig vom Betriebssystem gültig, solange es sich um eine Art Unix handelt. Wenn Sie jedoch auf etwas Linux-Spezifisch stolpern, werden Sie es wissen. Wir behandeln Konzepte wie Standardeingang, Ausgabe und Fehler, eingehende Printf () und Dateizugriff unter anderem.

Grundlegende I/O

Bevor wir weiter gehen, nehmen wir uns etwas Zeit und sehen, worum es in diesem I/O geht. Wie viele von Ihnen wissen, steht der Begriff für Eingabe/Ausgabe und hat eine breite Bedeutung, aber in unserem Fall sind wir daran interessiert, wie sie Nachrichten in die Konsole drucken und wie Sie Eingaben vom Benutzer sowie fortgeschrittenere Themen im selben erhalten können Vene. Die Standard-C-Bibliothek definiert eine Reihe von Funktionen dafür, wie Sie sehen werden, und nachdem Sie ein wenig gelesen haben. Es ist von Anfang an besser klar, dass die Einrichtungen, über die dieses Material spricht, nicht Teil der C -Sprache sind an sich; Wie gesagt, die Standard -C -Bibliothek bietet sie an.

Standard -I/O

Kurz gesagt, der obige Untertitel bedeutet "Eingabetaste vom Benutzer abrufen, Zeichen für die Standardausgabe und den Standardfehler für den Standardfehler drucken". Heutzutage ist die Haupteingangsquelle zumindest auf dieser Ebene die Tastatur, und das Gerät, auf dem das System druckt, ist der Bildschirm, aber die Dinge waren nicht immer so. Die Eingabe wurde auf Teletypen getätigt (übrigens stammt der Gerätename TTY) und der Prozess war langsam und klobig. Jedes Unix-ähnliche System hat immer noch einige historische Reste in Bezug. Sie wissen, dass Sie durch die Verwendung des von Ihrer Shell angebotenen Betreibers von '>' umleiten können, aber wir sind vorerst nicht daran interessiert. Bevor wir den Artikel schließlich beginnen, hat ein wenig Erinnerung: Mac OS bis Version 9 hat einige einzigartige Funktionen in Bezug. Zum Beispiel erzeugt die Eingabetaste bei allen Unix-Systemen (-ähnliche) Systeme einen LF (Line-Feed). Unter Windows ist es cr/lf und auf Apple bis Mac OS 9 ist es Cr CR. Kurz gesagt, jeder kommerzielle UNIX -Anbieter versuchte, seinen OSS „einzigartig“ zu machen, indem er Funktionen hinzufügte. Apropos Dokumentation, die Handbuchseiten Ihres Systems sind von unschätzbarem Wert, wenn auch manchmal trocken, und auch ein gutes Buch über Unix -Design sieht Ihre Seite gut aus.

Wir haben Printf () in unseren vorherigen Raten und zum Drucken von Text auf dem Bildschirm gesehen. Wir haben auch Scanf () als Mittel gesehen, um Text vom Benutzer zu erhalten. Für einzelne Zeichen können Sie sich auf getChar () und putchar () verlassen. Wir werden jetzt einige nützliche Funktionen von Header sehen, die in der Standardbibliothek enthalten sind. Der erste Kopfball, über den wir sprechen werden, ist CTYPE.H, und es enthält Funktionen, die nützlich sind, um den Fall eines Charakters zu überprüfen oder zu ändern. Denken Sie daran, dass jeder Standard -Header über eine manuelle Seite verfügt, in der erläutert wird, welche Funktionen verfügbar sind, und dass die Funktionen wiederum Menschen Seiten haben, die die Rückgabetypen, Argumente usw. beschreiben. Hier ist ein Beispiel, das jedes Zeichen in einer Zeichenfolge mit Tolower () in eine Kleinigkeit umwandelt () in Kleinbuchstaben umwandelt. Wie würden Sie das Gegenteil erreichen??

#include #include int main () int c; /* Das Zeichen gelesen*/ während ((c = getChar ()) != Eof) putchar (tolower (c)); zurückkehren 0;  

Eine andere Frage für Sie ist: Inwiefern sollte der Code so geändert werden? Das heißt, sofern der Satz immer von einem Punkt und einem Raum beendet wird.

printf () im Detail

Da es eine so weit verbreitete Funktion ist, hatte ich nur das Gefühl, dass es einen Unterabschnitt von seinem eigenen verdient. printf () akzeptiert Argumente, die mit dem Symbol "%" vorangestellt sind und von einem Brief (oder mehr) gefolgt werden, um ihm zu sagen, welche Art von Eingabe es erwarten sollte. Wir haben zuvor mit '%d' gearbeitet, was für Decimal steht, was bei der Arbeit mit Ganzzahlen angemessen ist. Hier finden Sie eine vollständigere Liste der Formatspezifizierer von printf ():

  • D, I - Ganzzahl
  • o - Oktal, ohne das Präfixen Null
  • x, x - hexadezimal, ohne das Präfixing 0x
  • u - unsigned int
  • C - Char
  • S - String, char *
  • F, E, E, G, G, - Float - Überprüfen Sie das printf () -Behanal Ihres Systems
  • P - Zeiger, void *, implementierungsabhängig, Standard zwischen Linux -Distributionen

Ich empfehle Ihnen dringend, sich etwas Zeit zu nehmen, um mit diesen Spezifikatoren zu spielen, und die Tatsache, dass ich nicht mehr detaillierter eingestuft habe wie Präzision, liegt daran, dass Sie selbst lesen müssen. Achten Sie während des Teils des variablen Argument-Listen-Teils besondere Aufmerksamkeit und beachten Kann die manuellen Abschnitte anders anlegen).

scanf () ist das Gegenteil von printf, da es den Benutzer eingibt, anstatt an den Benutzer auszugeben. Die Formatspezifizierer sind fast gleich, mit bestimmten Ausnahmen in Bezug auf Floats und der Tatsache, dass es keinen %p hat. Warum denkst Du, das ist? Es unterstützt auch variable Argumentelisten, genau wie printf ().

Dateizugriff

Dies ist ein weiterer wesentlicher Bestandteil von E/A und da C relativ niedrig ist, können Sie Dateien auf einfache Weise lesen und schreiben. Der Header, der diese einfache Funktionalität bietet stdio.H, und die Funktion, die Sie verwenden, ist fopen (). Es nimmt den Dateinamen als Argument sowie den Modus an, den er gelesen werden sollte (lesen/schreiben (R, W). Anhängen (a) oder binär (b) im Gegensatz zum Text - aber die Implementierung des letzteren ist systemabhängig). fopen () gibt einen Dateizeiger zurück, der ein Typ ist. Vor allem benötigen Sie einen Dateizeiger, wie dargestellt:

Datei *fp; / *Dateizeiger */ fp = fopen ("/home/user/testfile.txt "," w "); fprintf (fp," meine Testdatei."))

Einfach: Ich habe eine Datei auf meiner Festplatte geöffnet und in die Zeichenfolge "Meine Testdatei" geschrieben. Sie haben vielleicht vermutet, ich habe einige Übungen. Würde es einen Unterschied machen, wenn die Datei existiert oder nicht? Was wäre, wenn es existierte, aber leer war? Sollte ich Append anstelle des Schreibmodus verwendet haben? Warum?

Nach der Verwendung der Datei muss man muss Schließe es. Dies ist wichtig, da durch Schließen Ihres Programms das Betriebssystem mitgeteilt wird: „Hey, ich bin mit dieser Datei fertig. Schließen Sie alle schmutzigen Puffer und schreiben Sie meine Datei auf zivilisierte Weise auf die Festplatte, sodass kein Datenverlust auftritt. “.

fcLose (FP);

Hier ist ein Beispiel für das echte Leben für die Verwendung von Datei -I/O aus Kimball Hawkins 'Yest -Programm, das uns hilft, an zwei Dinge zu erinnern: Erstens, dass aufgrund des UNIX -Designs (alles ist eine Datei), stdin, stdout und stderr Dateien, also sie kann mit Datei -E/A -Funktionen und zwei verwendet werden, dass der nächste Teil Stderr und Beenden behandelt.

void store_time ()  Wenn (TIME_OK == Falsch) zurückkehren; / * Keine Zeitinformationen, überspringen Sie es */ /* Stunde */ Wenn (tfield [0]> 24) fprintf (stderr, "Fehler: Schlechte Eingangsstunde: '%d' \ n", tfield [0]); Ausgang (1);  thetime-> tm_hour = tfield [0]; / * Minute */ Wenn (tfield [1]> 0)  Wenn (tfield [1]> 60) fprintf (stderr, "Fehler: schlechte Eingabeminute: '%d' \ n", tfield [1]); Ausgang (1);  thetime-> tm_min = tfield [1]; 

Behandeln Sie Fehler mit Stderr und Ausgang

Ihr Programm muss eine Möglichkeit haben, mit Fehlern umzugehen und das Betriebssystem und der Benutzer wissen zu lassen, dass etwas schief gelaufen ist. Während dieser Teil in keiner Weise eine Dissertation darüber ist, wie Sie Ihre möglichen Situationen in C behandeln können, handelt es sich um ein sehr nützliches und gut durchdachtes Element von UNIX: Ausgangsfehler an einem anderen Ort, der sich von Stdin unterscheidet, damit der Benutzer die trennen kann zwei beim Debuggen des Problems. Verwenden Sie auch Exit -Codes, damit der Benutzer weiß, wann das Programm erfolgreich abgeschlossen ist und wann es nicht getan wurde. Aus diesem Grund existiert Stderr für den ersten Teil, und deshalb existiert auch Exit () für den zweiten Teil. Der kluge Leser hat bereits die Idee aus dem Code -Beispiel oben genommen, sodass das System nur mitteilt, dass er nicht Text in der Standard-/Standardausgabe ausgibt, sondern auf dem speziellen „Kanal“, der insbesondere dafür existiert. In Bezug. Es ist in enthalten stdlib.H und gibt keinen Wert zurück. Es liegt an Ihnen, wie Sie in Kimballs Code oben sehen können, um zu beenden, ob es ein Problem gibt, damit die übergeordnete Funktion über den Exit -Status informiert werden kann.

Nützliche Header

Unnötig zu erwähnen zu wissen, dass die Standard -C -Bibliothek obligatorisch ist, wenn Sie mit C -Entwicklung unter Linux ernst werden möchten. Hier sind also ein paar andere Header, die Einrichtungen im Zusammenhang mit I/A und mehr anbieten:

Saite.H

Dieser Header wird sich bei der Arbeit mit String Conversions (Strto*()), dem Vergleich von Strings (STRCMP ()) als sehr hilfreich erweisen oder die Länge einer Zeichenfolge (strlen ()) vergleicht (STRCMP ()).

CTYPE.H

Neben der Fallumwandlung, CTYPE.H Bietet Funktionen an, die verschiedene Eigenschaften von Zeichen überprüfen. Einige von ihnen sind ISALNUM (), ISUPPER (), ISALPHA () oder ISSPACE (), und Sie sind eingeladen, zu erraten, was sie tun und wie sie funktionieren.

Mathematik.H

Viele Funktionen, die für mehr als die vier grundlegenden arithmetischen Operationen benötigt werden, sind hier zu finden, einschließlich SIN (), cos () oder exp ().

Weitere Lesen

Die erfahreneren Leser werden mich ans Kreuz nageln, weil ich keine fortgeschritteneren Themen wie malloc () oder size_t behandelt habe. Wie ich wiederholt sagte, war diese Serie in nicht als Know-All-Online-Buch für C-Entwicklung (so etwas gibt es sowieso nicht), sondern einen guten Ausgangspunkt für Anfänger. Ich bin der Meinung, dass der zukünftige C -Entwickler mit Zeigern relativ gut vertraut sein muss und wie die Speicherzuweisung funktioniert, bevor er anfängt, Malloc () Albträume zu haben. Nach dem Ende dieser Serie wird empfohlen, ein ausführliches Buch über C zu erhalten, nachdem Sie einige Meinungen von den alten gefragt haben (nicht H.P. Ich hoffe, dass die alten Lovecrafts), also vermeiden Sie falsche oder irreführende Informationen. Während Sie über Free () und malloc () bis wir fertig sind.

Abschluss

Der Artikel, der diesem folgt, wird etwas länger sein, da wir uns weiter in die UNIX -Art der C -Programmierung eintauchen, aber ein gutes Verständnis dafür, was hier gesagt wurde.

  • ICH. C Entwicklung unter Linux - Einführung
  • Ii. Vergleich zwischen C und anderen Programmiersprachen
  • III. Typen, Operatoren, Variablen
  • Iv. Ablaufsteuerung
  • V. Funktionen
  • Vi. Zeiger und Arrays
  • Vii. Strukturen
  • Viii. Grundlegende I/O
  • Ix. Codierungsstil und Empfehlungen
  • X. Ein Programm erstellen
  • Xi. Verpackung für Debian und Fedora
  • Xii. Ein Paket in den offiziellen Debian -Repositories erhalten

Verwandte Linux -Tutorials:

  • Dinge zu installieren auf Ubuntu 20.04
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
  • So definieren Sie eine benutzerdefinierte Firewall -Zone
  • Mint 20: Besser als Ubuntu und Microsoft Windows?
  • Mastering -Bash -Skriptschleifen beherrschen
  • Linux -Download
  • Dinge zu tun nach der Installation Ubuntu 22.04 Jammy Quallen…
  • Ubuntu 20.04 Leitfaden
  • Installieren Sie Arch Linux in VMware Workstation