Wstęp

Wstęp

Dzięki tej części naszego rozwoju C w artykule Linux przygotowujemy się do wyjścia ze strefy teoretycznej i wejdź do prawdziwego życia. Jeśli śledzisz serię do tego momentu i próbowałeś rozwiązać wszystkie ćwiczenia, będziesz miał teraz pojęcie o tym, o czym jest C, więc musisz wydostać się na wolności i zrobić praktyczne rzeczy, bez których teoria nie ma duża wartość. Niektóre z pojęć, które zobaczysz poniżej, są już znane, ale są one niezwykle ważne dla każdego programu C na dowolnym systemie OS podobnym do UNIX. Tak, informacje są ważne niezależnie od systemu operacyjnego, o ile jest to jakiś rodzaj unix, ale jeśli wpadniesz na coś specyficznego dla Linuksa, będziesz wiedział. Będziemy traktować koncepcje takie jak standardowe wejście, wyjście i błędy, dogłębne printf () i dostęp do plików, między innymi.

Podstawowe I/O

Zanim przejdziemy dalej, poświęćmy trochę czasu i zobaczmy, o co chodzi. Jak wielu z was wie, termin ten oznacza wejście/wyjście i ma szerokie znaczenie, ale w naszym przypadku jesteśmy zainteresowani, jak drukować wiadomości do konsoli i jak uzyskać dane wejściowe od użytkownika, a także bardziej zaawansowane tematy w tym samym żyła. Standardowa biblioteka C definiuje serię funkcji do tego, jak zobaczysz, a po przeczytaniu zauważysz, że będzie ci trudno żyć bez, chyba że chcesz ponownie zapisać wspomniane funkcje dla zabawy. Od samego początku lepiej jasno, że obiekty, o których mówi ten materiał, nie są częścią języka C jako taki; Jak powiedziałem, standardowa biblioteka C oferuje je.

Standardowe we/wy

Krótko mówiąc, powyższy napis oznacza „Wejdź od użytkownika, wydrukuj znaki na standardowym wyjściu i wydrukuj błędy na błędach standardowych”. W dzisiejszych czasach głównym źródłem wejściowym, przynajmniej na tym poziomie, jest klawiatura, a urządzenie, na którym system drukuje, jest ekran, ale rzeczy nie zawsze były takie. Wkład został wprowadzony w teletypach (tak przy okazji, nazwa urządzenia pochodzi z tego), a proces był powolny i niezgrabny. Każdy system podobny do UNIX wciąż ma kilka historycznych resztek, ale nie tylko we/wy, ale przez resztę tego artykułu będziemy traktować stdina jako klawiaturę i stdout/stderr jako ekran. Wiesz, że możesz przekierować plik, używając operatora oferowanego przez twoją powłokę, ale na razie nie jesteśmy tym zainteresowani. Zanim w końcu zaczniemy artykuł, małe przypomnienie: Mac OS do wersji 9 ma kilka unikalnych funkcji dotyczących naszego tematu, które zmusiły mnie do przeczytania dokumentacji przed rozpoczęciem opracowania na nim. Na przykład we wszystkich systemach UNIX (podobnych) klucz Enter generuje LF (kanał linii). W systemie Windows to CR/LF i na Apple do Mac OS 9 to Cr. Krótko mówiąc, każdy komercyjny sprzedawca UNIX próbował uczynić swoje OSS „unikalne”, dodając funkcje. Mówiąc o dokumentacji, ręczne strony twojego systemu okażą się nieocenione, choć może czasami suche, a także dobra książka o projekcie Unix będzie dobrze wyglądać po twojej stronie.

Widzieliśmy printf () w naszych poprzednich ratach i jak drukować tekst na ekranie. Widzieliśmy także Scanf () jako sposób na uzyskanie tekstu od użytkownika. W przypadku pojedynczych znaków możesz liczyć na getchar () i putchar (). Zobaczymy teraz kilka przydatnych funkcji z nagłówków zawartych w standardowej bibliotece. Pierwszym nagłówkiem, o którym porozmawiamy CTYPE.H, i zawiera funkcje przydatne do sprawdzania przypadku znaku lub zmiany. Pamiętaj, że każdy standardowy nagłówek ma stronę ręczną, wyjaśniając, jakie funkcje są dostępne, i wspomniane funkcje z kolei mają strony, szczegółowo opisując typy powrotu, argumenty i tak dalej. Oto przykład, który przekształca każdą postać w sznurku w małe litery, za pomocą Tolower (). Jak osiągnąłbyś odwrotnie?

#include #include int main () int c; /* znak odczytu*/ chwila ((c = getchar ()) != Eof) putchar (tolower (c)); powrót 0;  

Kolejne pytanie do ciebie brzmi: w jaki sposób należy zmodyfikować kod, aby wydrukować wynik o niższej cenie dopiero po zdaniu? To znaczy pod warunkiem, że zdanie zawsze kończy się kropką i przestrzenią.

printf () szczegółowo

Ponieważ jest to tak szeroko stosowana funkcja, czułem tylko, że zasługuje na podsekcję własnej. printf () akceptuje argumenty prefiksowane z symbolem „%”, a następnie list (lub więcej), mówiąc, jaki rodzaj wkładu powinien się spodziewać. Pracowaliśmy wcześniej z „%D”, co oznacza dziesiętne, co jest odpowiednie podczas pracy z liczbami całkowitych. Oto pełniejsza lista specyfikatorów formatu printf ():

  • d, i - liczba całkowita
  • o - Octal, bez prefiksów zero
  • x, x - heksadecimal, bez prefiksów 0x
  • u - unsigned int
  • C - char
  • S - String, char *
  • f, e, e, g, g, - float - Sprawdź instrukcję instruktażu swojego systemu printf ()
  • P - wskaźnik, void *, zależne od implementacji, standard między Linux Distros

Gorąco polecam poświęcić trochę czasu na zabawę z tymi specyfikatorami, a fakt, że nie dostałem bardziej szczegółów, jak precyzja, jest to, że będziesz musiał czytać dla siebie. Podczas gdy jesteś na tym, zwróć szczególną uwagę na część listy argumentów zmiennych i pamiętaj, że Linux ma polecenie o nazwie printf, jako część Coreutils, więc upewnij się, że używasz strony ManPage z sekcji 3 (specyficzna dla Linux, jako inne jednostki mogą mieć inaczej sekcje ręczne).

scanf () jest przeciwieństwem printf, ponieważ przyjmuje dane wejściowe od użytkownika zamiast wyjścia do użytkownika. Specyfikatory formatu są prawie takie same, z pewnymi wyjątkami dotyczącymi pływaków i faktem, że nie ma %p. Jak myślisz, dlaczego tak jest? Obsługuje także listy argumentów zmiennych, podobnie jak printf ().

Dostęp do pliku

To kolejna istotna część we/wy, a ponieważ C jest stosunkowo niski poziom, pozwala odczytać i pisać pliki na dysk w prosty sposób. Nagłówek, który oferuje tę prostą funkcjonalność Stdio.H, a funkcją, której będziesz używać, jest fopen (). Zakłada nazwę pliku jako argument, a także tryb, który należy odczytać (czytaj/zapis (r, w). Dodatek (a) lub binarny (b), w przeciwieństwie do tekstu - ale wdrożenie tego ostatniego jest zależne od systemu). fopen () zwraca wskaźnik pliku, który jest typem. Przed cokolwiek potrzebujesz wskaźnika pliku, jak ilustrowano:

Plik *fp; / *wskaźnik pliku */ fp = fopen ("/home/user/testFile.txt "," w "); fprintf (fp,„ mój plik testowy.")

Proste: otworzyłem plik na dysku i napisałem do niego ciąg „Mój plik testowy”. Mogłeś się domyślać, mam kilka ćwiczeń. Czy to znaczy, jeśli plik istnieje, czy nie? Co jeśli istniał, ale był pusty? Czy powinienem używać dodatku zamiast trybu zapisu? Dlaczego?

Po użyciu pliku trzeba Zamknij to. Jest to ważne, ponieważ zamykając program informuje system operacyjny „Hej, skończyłem z tym plikami. Zamknij wszystkie brudne bufory i napisz mój plik na dysk w cywilizowany sposób, więc nie zachodzi utrata danych ”.

fclose (FP);

Oto prawdziwy przykład korzystania z plików we/wy z wcześniejszego programu Kimball Hawkins, który pomaga nam zapamiętać dwie rzeczy: jedną, że z powodu projektu Unixa (wszystko jest plik), stdin, stdout i stderr to pliki, więc one one są pliki, więc one one są pliki może być używane z funkcjami we/wy plików i dwiema, że ​​następna część traktuje Stderr i wyjście.

void Store_Time ()  Jeśli (time_ok == false) powrót; / * Nie ma informacji o czasie, pomiń je */ /* Godzina */ Jeśli (tfield [0]> 24) fprintf (stderr, „błąd: zła godzina wejścia: '%d' \ n", tfield [0]); wyjście (1);  theTime-> tm_hour = tfield [0]; /* Minuta */ Jeśli (tfield [1]> 0)  Jeśli (tfield [1]> 60) fprintf (stderr, „error: Bad Input Minute: '%d' \ n", tfield [1]); wyjście (1);  theTime-> tm_min = tfield [1]; 

Traktowanie błędów za pomocą STDERR i wyjścia

Twój program musi mieć sposób na poradzenie sobie z błędami i poinformować system operacyjny i użytkownik wiedział, że coś poszło nie tak. Chociaż ta część w żaden sposób nie jest rozprawą, jak traktować możliwe sytuacje w C, dotyczy bardzo użytecznego i dobrze przemyślanego elementu UNIX: błędy wyjściowe w innym miejscu, inne niż stdin, aby użytkownik mógł oddzielić dwa podczas debugowania problemu. Użyj także kodów wyjściowych, aby użytkownik wiedział, kiedy program zakończył się pomyślnie i kiedy nie. Właśnie dlatego Stderr istnieje, po pierwszej części, i dlatego Exit () również istnieje, po drugiej części. Bystry czytnik już dostał pomysł z powyższego kodu, więc wystarczy, że system nie wysyła tekstu na wyjściu domyślnym/standardowym, ale na specjalnym „kanale”, który istnieje specjalnie dla tego. Jeśli chodzi o exit (), działa tak: zero dla sukcesu, każda inna wartość od 1 do 255 w przypadku awarii. Jest zawarty w stdlib.H i nie zwraca wartości. Od Ciebie zależy, jak widać w kodzie Kimball powyżej, aby powiedzieć wyjście, czy istnieje problem, aby może poinformować funkcję nadrzędną o statusie wyjścia.

Przydatne nagłówki

Nie trzeba dodawać, że znajomość standardowej biblioteki C jest obowiązkowa, jeśli chcesz poważnie rozwój C w Linux. Oto kilka innych nagłówków, które oferują udogodnienia związane z we/wy i więcej:

strunowy.H

Ten nagłówek okaże się bardzo pomocny podczas pracy z konwersjami strun (strto*()), porównywanie Strings (strcmp ()) lub sprawdzanie długości sznurka (strlen ()).

CTYPE.H

Oprócz konwersji przypadków, CTYPE.H oferuje funkcje, które sprawdzają różne właściwości znaków. Niektóre z nich to isalnum (), isupper (), isalpha () lub issPace (), i jesteś zaproszony do odgadnięcia, co robią i jak działają.

matematyka.H

Można tu znaleźć wiele funkcji potrzebnych więcej niż cztery podstawowe operacje arytmetyczne, w tym sin (), cos () lub exp ().

Dalsze czytanie

Bardziej doświadczeni czytelnicy przybiją mnie do krzyża za nie leczenie bardziej zaawansowanych przedmiotów, takich jak Malloc () lub size_t. Jak wielokrotnie mówiłem, ta seria nie była zamierzona jako książka internetowa do rozwoju C (i tak nie ma czegoś takiego), ale raczej dobry punkt wyjścia dla początkujących. Uważam, że przyszły programista C musi być stosunkowo dobrze zaznajomiony z wskaźnikami i jak działa alokacja pamięci, zanim zacznie mieć koszmary Malloc (). Po zakończeniu tej serii zaleca się uzyskanie dogłębnej książki na temat C, po zaproszeniu opinii starych.P. Mam nadzieję, że stare Lovecrafta), więc unikasz fałszywych lub wprowadzających w błąd informacji. Podczas gdy będziesz wiedział o Free () i Malloc (), dopóki nie skończymy, prawdopodobnie najlepiej jest dostać drukowaną książkę i spać z nią pod poduszką.

Wniosek

Artykuł, który nastąpi po tym, będzie nieco dłużej, ponieważ zagłębimy się w sposób programowania C UNIX, ale dobre zrozumienie tego, co zostało tutaj powiedziane, jest zalecane, aby kolejne kroki były jak najbardziej płynne, jak to możliwe.

  • I. C Opracowanie w Linux - Wprowadzenie
  • Ii. Porównanie C i innych języków programowania
  • Iii. Typy, operatorzy, zmienne
  • Iv. Kontrola przepływu
  • V. Funkcje
  • Vi. Wskaźniki i tablice
  • VII. Struktury
  • VIII. Podstawowe I/O
  • IX. Styl kodowania i zalecenia
  • X. Budowanie programu
  • Xi. Opakowanie dla Debiana i Fedory
  • XII. Uzyskanie pakietu w oficjalnych repozytoriach Debiana

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Jak zdefiniować niestandardową strefę zapory
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Mastering Bash Script Loops
  • Pobierz Linux
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…
  • Ubuntu 20.04 Przewodnik
  • Zainstaluj Arch Linux na stacji roboczej VMware