Tartalmi kivonat
Bauer Péter – Hatwágner F. Miklós PROGRAMOZÁS II. Készült a HEFOP 3.31-P-2004-09-0102/10 pályázat támogatásával Szerzők: Bauer Péter egyetemi adjunktus Hatwágner F. Miklós tanszéki mérnök Lektor: dr. Szörényi Miklós főiskolai docens Szerzők, 2006 Programozás II. A dokumentum használata A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 3 ► A dokumentum használata Mozgás a dokumentumban A dokumentumban való mozgáshoz a Windows és az Adobe Reader megszokott elemeit és módszereit használhatjuk. Minden lap tetején és alján egy navigációs sor található, itt a megfelelő hivatkozásra kattintva ugorhatunk a használati útmutatóra, a tartalomjegyzékre, valamint a tárgymutatóra. A ◄ és a ► nyilakkal az előző és a következő oldalra léphetünk át, míg a Vissza mező az utoljára megnézett oldalra visz vissza bennünket. Pozícionálás a könyvjelzőablak segítségével A bal oldali
könyvjelző ablakban tartalomjegyzékfa található, amelynek bejegyzéseire kattintva az adott fejezet/alfejezet első oldalára jutunk. Az aktuális pozíciónkat a tartalomjegyzékfában kiemelt bejegyzés mutatja. A tartalomjegyzék és a tárgymutató használata Ugrás megadott helyre a tartalomjegyzék segítségével Kattintsunk a tartalomjegyzék megfelelő pontjára, ezzel az adott fejezet első oldalára jutunk. A tárgymutató használata, keresés a szövegben Keressük meg a tárgyszavak között a bejegyzést, majd kattintsunk a hozzá tartozó oldalszámok közül a megfelelőre. A további előfordulások megtekintéséhez használjuk a Vissza mezőt A dokumentumban való kereséshez használjuk megszokott módon a Szerkesztés menü Keresés parancsát. Az Adobe Reader az adott pozíciótól kezdve keres a szövegben A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 3 ► Programozás II. A dokumentum használata | Tartalomjegyzék |
Tárgymutató Tartalomjegyzék Vissza ◄ 4 ► Tartalomjegyzék 1. Bevezetés 6 1.1 Jelölések 6 2. Helyi információ 8 2.1 setlocale 8 2.2 lconv struktúra 13 2.3 localeconv 15 2.4 Példa16 2.5 Ellenőrző kérdések: 17 2.6 Megoldandó feladatok:17 3. Többájtos és széles karakterek 18 3.1 Egybájtos karakterek (Single Byte Characters) 18 3.2 Többájtos karakterek (MultiByte Characters) 18 3.3 Széles karakterek (Wide Characters) 20 3.4 Konverzió többájtos és széles karakterek közt 22 3.5 Széles karakterek osztályozása 31 3.6 Széles karakterláncok és memóriaterületek kezelése 37 3.7 Adatkonverzió 49 3.8 Széles (Unicode) folyam (stream) B/K szöveges és bináris módban . 52 3.9 Ellenőrző kérdések: 57 3.10 Megoldandó feladatok:58 4. Az idő kezelése 60 4.1 Az idő karakterlánc 61 4.2 Az idő struktúra (struct tm) 61 4.3 time 61 4.4 time t típus 62 4.5 difftime 62 4.6 ctime 62 4.7 gmtime, localtime 63 4.8 mktime64 4.9 asctime65 4.10
strftime, wcsftime 66 4.11 clock69 4.12 Ellenőrző kérdések: 70 A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 4 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Tartalomjegyzék Vissza ◄ 5 ► 4.13 Megoldandó feladatok:71 5. Nem helyi vezérlésátadás és jel(zés)kezelés 71 5.1 Nem helyi vezérlésátadás 71 5.2 Jel(zés)kezelés 73 5.3 Ellenőrző kérdések 76 5.4 Megoldandó feladatok77 6. Fájlok és könyvtárak kezelése 78 6.2 Fájlok megnyitása és bezárása 83 6.3 Olvasás és írás89 6.4 Pozícionálás a fájlban 94 6.5 Fájl attribútumok 98 6.6 Fájl zárak 132 6.7 Könyvtárak 138 6.8 Ellenőrző kérdések: 148 6.9 Megoldandó feladatok:149 7. Folyamatok 151 7.1 Parancsok végrehajtása151 7.2 Folyamatok létrehozásának módjai 153 7.3 Folyamatok azonosítása 154 7.4 Folyamatok létrehozása154 7.5 Fájlok futtatása 157 7.6 Folyamatok befejeződése162 7.7 Állapotinformációk
értelmezése 165 7.8 Ellenőrző kérdések 166 7.9 Megoldandó feladatok167 8. Folyamatközi kommunikáció 168 8.1 Osztott és leképezett memória 168 8.2 Csövek 169 8.3 Nevesített csövek 174 8.4 Foglalatok177 8.5 Ellenőrző kérdések 198 8.6 Megoldandó feladatok198 Irodalomjegyzék. 199 Tárgymutató . 200 A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 5 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Bevezetés Vissza ◄ 6 ► 1. Bevezetés Ez a jegyzet a Széchenyi István Egyetem informatikai szakjai programozás II. tantárgyához készült A programozás II a programozás I tantárgy szerves folytatása, melyek együtt két féléven keresztül kívánják megalapozni a mérnök hallgatók programozási készségeinek kialakítását. A programozás I. és II tantárgyak célját és tananyagát Dr Sziray József, Dr Benyó Balázs és Heckenast Tamás javaslata rögzítette Cél az ANSI/ISO
szabványos C nyelv haladó szintű használatának elsajátítása, beleértve az operációs rendszerekhez közeli programozást is. Ez utóbbi ismeretek tanítása a Web–programozás irányába történő előkészítést is szolgálja. A [2] lefedi a teljes programozás I. tárgyat és a programozás II első felét (7 hét) Ez a jegyzet a szemeszter maradék 8 hetének tananyagát taglalja, melynek van szabványos és operációs rendszerekhez közeli része A szabványos részek: • • • • a helyi információ, a többájtos és széles karakterek, az idő és a jel(zés)ek (signal) kezelése. A POSIX szabványos rendszer közeli részek: • az alacsony szintű fájl és könyvtár manipulációk, • a folyamatkezelés és • a folyamatközi kommunikáció (cső és foglalat). 1.1 Jelölések < > zárójel párba tettük, ami elhagyható, ha ez a szintaktikának nem része. | függőleges vonallal jelöltük a vagylagosságot. Figyelem felkeltés. Valamely
következtetés levonása az eddigiekből Esetleg: merre találhatók további részletek a kérdéses témával kapcsolatban Lexikális ismeretek taglalása. Valamely folyamat pontosabb részletei Egy fogalom precízebb definíciója 0 Valamilyen aránylag könnyedén elkövethető, de nehezen lokalizálható hiba. A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 6 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Bevezetés Vissza ◄ 7 ► ◄ 7 ► Forrásprogramok és képernyő tartalmak szövege. Valamilyen konkrétummal helyettesítendő szintaktikai egység. Kulcsszó vagy valamilyen azonosító. A fogalom első előfordulásának jelölésére szolgál. A megoldandó, vagy megoldott feladatokat így jelöltük. A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Helyi információ Vissza ◄ 8 ► 2.
Helyi információ A LOCALE.H fejfájlt be kell kapcsolni az itt tárgyalt ANSI/ISO szabványos típusok, szimbolikus állandók és függvények használatához A helyi információ ilyenekből tevődik össze, mint az ország, a nyelv, a dátum formátuma, a pénznem, stb. Ezeket az összetevőket helyi kategóriáknak nevezzük A helyi kategóriák praktikusan a LOCALEH fejfájlban definiált szimbolikus állandók, melyeket a lokalizációs rutin használ annak specifikálására, hogy a program helyi információjának mely részéről van szó. A hely bizonyos vonatkozásait a könyvtári rutinok automatikusan kezelik. Például: karakterláncok összehasonlítását a kiválasztott helynek megfelelően az strcoll, vagy az strxfrm függvények segítségével tehetjük meg Más helyi vonatkozások viszont kívül esnek a könyvtári rutinok hatáskörén. Ilyen például a (hiba)üzenetek nyelve Alapértelmezés a ”C” hely, mely minimális ANSI/ISO konform környezetet
definiál a C fordításhoz, és az ANSI/ISO szabvány azt mondja ki, hogy minden program e hely beállításával indul. A ”C” hely részleteiről a fejezet további részeiben lesz még szó! 2.1 setlocale char*setlocale(int kategoria, const char locale); Az aktuális program helyi információját vagy annak egy részét a locale és a kategoria paraméterek értékének megfelelően a setlocale függvény állítja be, módosítja, vagy kérdezi le. A locale arra a helyre (ország és nyelv) hivatkozik, melynek bizonyos kategoriajára hatni kívánunk a függvénnyel. A lehetséges kategóriák, s hogy az egyes helyi kategóriák mire hatnak, a következő felsorolásban láthatók: 2.11 LC ALL Minden hely specifikus viselkedésre (minden kategóriára) hat. 2.12 LC COLLATE Olyan helyeken, ahol a karakterkészlet kódjainak szigorú numerikus sorrendje eltér a lexikografikus karaktersorrendtől, a karakterláncokat a következő függvényekkel kell összehasonlítani:
kis/nagybetű érzékenyen a szabványos strcoll–lal, wcscoll–lal, kis/nagybetű érzékenység nélkül a A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 8 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Helyi információ Vissza ◄ 9 ► nem szabványos stricoll–lal, wcsicoll–lal és az első n karaktert ugyanilyen módon a nem szabványos strnicoll–lal, wcsnicoll–lal. A karakterláncokat a helynek megfelelő összehasonlítható formába transzformáló szabványos strxfrm és wcsxfrm rutinok viselkedésére is hat ez a kategória. Előbb az strxfrm alkalmazandó az összehasonlítandó, eredeti karakterláncokra, s csak aztán hívható meg rájuk az strcmp. A ”C” helyen a lexikografikus sorrend egyezik a karakterkódok numerikus sorrendjével, azaz az strcoll azonos az strcmp–vel, és nincs szükség az strxfrm–re. Az itt említett rutinokat a következő nagy fejezetben tárgyaljuk!
2.13 LC CTYPE Az isdigit, az isxdigit függvények kivételével a karakterosztályozó, valamint bizonyos többájtos és széles karakteres konverziós rutinok viselkedését befolyásolja a kategória. Ideértendők például: • az egész értéket tesztelő is és isw függvények, • a többájtos karakter(lánc) érvényességét vizsgáló és bájtban mért hoszszát megállapító rutinok, • a többájtos karaktert/karaktersorozatot széles karakterré/karaktersorozattá alakító és a megfordított konverziót végző függvények, • az adott karaktert kisbetűssé konvertáló tolower, towlower és nagybetűssé konvertáló toupper, towupper. Az itt említett rutinokkal is a következő nagy fejezetben foglalkozunk! 2.14 LC MONETARY Pénzügyi értékek formázását befolyásolja. Lásd a localeconv függvényt később! 2.15 LC NUMERIC Nem pénzügyi értékek formázására hat. Lásd később a localeconv–ot! A decimális pont karaktert, a számjegy
csoportokat elválasztó karaktert, a számrendszer alap felismerést stb. rögzíti A sima vagy széles karakterláncokat belső ábrázolás formákba konvertáló rutinokra (atof, atoi, atol, strtod, wcstod, strtol, wcstol, strtoul és wcstoul) van hatással. A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 9 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Helyi információ Vissza ◄ 10 ► A decimális pont karaktert, a számrendszer alap karaktert és felismerést stb. befolyásolja a formázott kimenetre (a printf család), valamint a formázott bemenetre (a scanf család). 2.16 LC TIME A dátum és idő értékeket formázó strftime és wcsftime függvények viselkedésére hat. Lásd az „Az idő kezelése” fejezetben a részleteket! Visszatérve a setlocale tárgyalásához, ha érvényes locale és kategoria paramétert adnak meg, akkor a függvény a specifikált hellyel és kategóriával kapcsolatos,
statikus élettartamú pufferben elhelyezett karakterláncra mutató mutatóval tér vissza. Érvénytelen paraméter esetén NULL mutatót szolgáltat a rutin, és a program aktuális helyi információ beállításai változatlanok. Ha a locale NULL mutató, akkor a setlocale a program helyi információ kategoriajához kapcsolódó karakterláncra mutató mutatóval tér vissza, és a program aktuális helyi beállításai változatlanok. A NULL mutató setlocale–lal kapcsolatban egyébként a nemzetközi környezet lekérdezését „erőltető” direktíva. setlocale(LC ALL, NULL); A ”C” locale minimális ANSI konform környezetet definiál a C fordításhoz a megadott kategoriara. A ”C” locale feltételezi, hogy minden char adattípus 1 bájtos, és hogy értéke mindig kisebb 256–nál. A programindítás hatására mindig setlocale(LC ALL, "C"); hív a cél környezet, mielőtt a main–t indítaná. Ha a locale mutatta karakterlánc üres, setlocale(LC
ALL, ""); akkor a hely az implementáció definiálta, eredeti környezet a kategoria paraméterrel előírt kategóriára. Az eredeti környezet tulajdonképpen az operációs rendszertől nyert, alapértelmezés szerinti hely A locale mutathat a setlocale korábbi hívásából visszakapott karakterláncra, és természetesen az implementáció definiálta más karakterláncokra. 0 A setlocale által visszaadott karakteres mutató csak a rákövetkező függvényhívásban használható a program helyi információ részeinek helyreállítására, feltéve, hogy a program közben nem változtatta meg sem a mutató, sem a mutatott karakterlánc értékét. A későbbi setlocale hívás felülírja ezt a statikus helyfoglalású karakterláncot, s így a kérdéses hely karakterláncot későbbi felhasználáshoz feltétlenül el kell menteni. Például: A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 10 ► Programozás II. A dokumentum
használata | Tartalomjegyzék | Tárgymutató Helyi információ Vissza ◄ 11 ► char * forras = setlocale(LC ALL, ””), ment = malloc(strlen(forras)+1); strcpy(ment, forras); A nagy fejezet végén ismertetett HELYINFO.C példa lekérdezi és kijelzi, hogy milyen hely van érvényben a program indulásakor. Rendszer alapértelmezett helyet állít, és ezt is kijelzi Végül minimális ANSI konform C helyet rögzít, és demonstrálja ezt is. 2.17 Microsoft Visual C++ Windows–os környezetben A locale paraméter a hely nevét specifikáló karakterláncra mutat. A Microsoft Visual C++ támogat minden, a „Language and Country/Region Strings” címszó alatt listázott helyet. Például a setlocale(LC ALL, "English"); minden kategóriát beállít, és csak az ”English USA.1252” karakterlánccal tér vissza. Ha nem minden kategóriát állíttatunk be, akkor a setlocale mindenegyes kategória aktuális beállításait (egymástól ; választja el őket!)
jelző karakterláncot szolgáltat. Például a következő függvényhívás sorozat // Minden kategória beállítása és "English USA.1252" // visszaadása. setlocale(LC ALL, "English"); // Csak az LC MONETARY kategória beállítása és // "French France.1252" szolgáltatása setlocale(LC MONETARY, "French"); setlocale(LC ALL, NULL); azt eredményezi, hogy az LC ALL kategóriára visszakapott karakterlánc: LC COLLATE=English USA.1252; LC CTYPE=English USA.1252; LC MONETARY=French France.1252; LC NUMERIC=English USA.1252; LC TIME=English USA.1252 A locale paraméter a következő formájú: "<lang< country<.code page>>>" | ".code page" | "" | NULL Végül is a Win32 NLS API által támogatott, minden nyelv (lang), minden ország ( country) és minden kódlap (.code page) rendelkezésre áll Az operációs rendszer által nem támogatott nyelveket a setlocale sem fogadja. A három betűs
nyelv kód ("hun") csak Windows NT–ben és ennél későbbi verziókban érvényes, viszont bárhol használható a hosszú A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 11 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Helyi információ Vissza ◄ 12 ► nyelv karakterlánc ("hungarian"). Az ország kódokról ("hun" vagy "hungary") ugyanezek mondhatók el! A kódlapokkal később még bővebben foglalkozunk! A következő példák mind az LC ALL kategóriára vonatkoznak. A setlocale(LC ALL, "<lang country>"); a megadottra állítja a hely nyelvét, országát, és az operációs rendszertől nyert alapértelmezett kódlapot használtatja. A setlocale(LC ALL, "<lang country.code page>"); a paraméterként megadottakra állítja a nyelvet, az országot és a kódlapot. A nyelv, az ország és kódlap változatos kombinációit
használhatjuk. Például: setlocale(LC ALL, "French Canada.1252"); // Francia Kanadához ANSI alapértelmezett kódlapot állít. setlocale(LC ALL, "French Canada.ACP"); // Francia Kanadához OEM alapértelmezett kódlapot állít. setlocale(LC ALL, "French Canada.OCP"); A megadott nyelvre, s a nyelvre alapértelmezett országra állítja a helyet a setlocale(LC ALL, "<lang>"); függvény és a kódlap az operációs rendszertől az országra kinyert rendszer alapértelmezett, ANSI kódlap lesz. A következő, két setlocale hívás funkcionálisan ekvivalens: setlocale(LC ALL, "English"); setlocale(LC ALL, "English United States.1252"); A kódlapot a megadottra állítja a setlocale(LC ALL, "<.code page>"); és a kódlaphoz a gazda operációs rendszerben definiált, alapértelmezett országot, nyelvet használja. A ".code page" helyén mind az "OCP", mind az "ACP"
karakterlánc használható a rendszer alapértelmezett OEM, ill. ANSI kódlap definiálására A setlocale(LC ALL, ".OCP"); a helyi információt explicit módon az operációs rendszertől nyert, aktuális OEM kódlapra állítja. A setlocale(LC ALL, ".ACP"); az operációs rendszertől nyert, aktuális ANSI kódlapot állítja be. A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 12 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Helyi információ Vissza ◄ 13 ► 0 Ha a kódlapot változtatni kívánjuk, akkor a kategorianak LC ALL– nak vagy LC CTYPE–nak kell lennie. Ha a gazda operációs rendszer alapértelmezett országa és nyelve “United States” és “English”, akkor a következő két setlocale hívás ekvivalens: setlocale(LC ALL, ".1252"); setlocale(LC ALL, "English United States.1252"); A #pragma setlocale a „Preprocessor Reference”–en belül a
„Pragma Directives” címszónál található meg! 2.2 lconv struktúra A struct lconv tagjai leírják, hogyan kell formázni a numerikus és a pénzügyi értékeket. A szabványos C könyvtár függvényei a struktúrából csak a decimal point tagot használják, s a többi információt nem veszik igénybe. Az összes char * típusú tag – legfeljebb üres ("") – karakterláncokra mutat. Az üres karakterlánc az elsődleges értelmén túl azt is jelenti, hogy az ilyen tagot nem támogatja az aktuális hely. Programindításkor az automatikusan beállított ”C” helyen az összes char * típusú tag üres karakterlánc a decimal point kivételével, ami viszont ”.” A struktúra char típusú tagjai nem negatív számok. Ezek közül a CHAR MAX értékűeket nem támogatja az aktuális hely. A ”C” helyen az összes char típusú tag CHAR MAX értékű. A struct lconv tagjai után zárójelbe tettük az érintett helyi kategóriát, ill. a másik
zárójelben az USA hely vonatkozó értékét közöltük A struktúra tagjai a következők: • char *decimal point: (LC NUMERIC) (”.”) Decimális pont karakter nem pénzügyi mennyiségekre • char *thousands sep: (LC NUMERIC) (”,”) A decimális ponttól balra képzett számjegy csoportokat elválasztó karakter nem pénzügyi mennyiségekre. • char *grouping: (LC NUMERIC) (”3”) A számjegy csoportok mérete nem pénzügyi mennyiségekben. A karakterlánc egymást követő char típusú elemei írják le a decimális ponttól indulva és balra haladva a csoportokat. A karaktertömb elemei a következők lehetnek: A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 13 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató • • • • • • • Helyi információ Vissza ◄ 14 ► • CHAR MAX: Ne hajtson végre semmilyen további csoportosítást. A CHAR MAX elemérték befejezi a további
csoportosítás, s ennél fogva a karakterláncot is. • 0: A karakterlánc záró null karakter az előző elemet ismételteti korlátlanul, azaz előírja, hogy az előző elemet kell továbbhasználni a maradék számjegyekre rendre. • n: Az aktuális csoportot alkotó számjegyek száma. A következő elemet vizsgálja az aktuális előtti, következő számjegy csoport méretének meghatározásához. A {3, 2, CHAR MAX} tartalmú tömb előír egy hármas, majd egy kettes számjegy csoportot, s aztán jöhet, ami marad. Ez alapján a 987654321 kijelzése 9876,54,321. lenne A ”3” hármas számjegy csoportot ismétel, azaz az előbbi érték kijelzése 987,654,321 A ”3” karakterlánc ugye {3, 0} tartalmú tömböt jelent! char *int curr symbol: (LC MONETARY) (”USD ”) Az aktuális hely nemzetközi pénznem szimbóluma. Az első három karakter úgy specifikálja a pénznem szimbólumot, ahogyan azt az ISO 4217 Codes for the Representation of Currency and Funds
szabvány meghatározza. A lezáró null karaktert közvetlenül megelőző, negyedik karakter választja el a szimbólumot a pénzügyi mennyiségtől. char *currency symbol: (LC MONETARY) (”$”) Pénznem szimbólum az aktuális helyre. char *mon decimal point: (LC MONETARY) (”.”) Decimális pont karakter pénzügyi mennyiségekre. char *mon thousands sep: (LC MONETARY) (”,”) A decimális ponttól balra képzett számjegy csoportokat elválasztó karakter pénzügyi mennyiségekre. char *mon grouping: (LC MONETARY) (”3”) A számjegy csoportok mérete pénzügyi mennyiségekben. A karakterlánc egymást követő elemei írják le a decimális ponttól indulva és balra haladva a csoportokat A kódolás egyezik a grouping tagnál leírtakkal char *positive sign: (LC MONETARY) (”+”) Nem negatív pénzügyi mennyiségek előjelét jelző karakterlánc. char *negative sign: (LC MONETARY) (”–”) Negatív pénzügyi mennyiségek előjelét jelző karakterlánc. A
dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 14 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Helyi információ Vissza ◄ 15 ► • char int frac digits: (LC MONETARY) (2) Számjegyek száma a decimális ponttól jobbra nemzetközi formázású pénzügyi mennyiségekben. • char frac digits: (LC MONETARY) (2) Számjegyek száma a decimális ponttól jobbra formázott pénzügyi mennyiségekben. • char p cs precedes: (LC MONETARY) (1) 1, ha a pénznem szimbólum megelőzi a nem negatív formázott pénzügyi mennyiséget, s 0, ha követi. • char p sep by space: (LC MONETARY) (0) 1, ha a pénznem szimbólumot szóköz választja el a nem negatív formázott pénzügyi mennyiségtől, s 0, ha nincs szóközös elválasztás. • char n cs precedes: (LC MONETARY) (1) 1, ha a pénznem szimbólum megelőzi a negatív formázott pénzügyi mennyiséget, s 0, ha követi. • char n sep by space: (LC MONETARY) (0) 1,
ha a pénznem szimbólumot szóköz választja el a negatív formázott pénzügyi mennyiségtől, s 0, ha nincs szóközös elválasztás. • char p sign posn: (LC MONETARY) (4) A pozitív előjel pozíciója nem negatív formázott pénzügyi mennyiségekben. • char n sign posn: (LC MONETARY) (4) Az előjel pozíciója negatív formázott pénzügyi mennyiségekben. A p sign posn és az n sign posn értékére a következő szabályok érvényesek: • 0: A zárójelek foglalják be a mennyiséget és a pénznem szimbólumot. • 1: Az előjel megelőzi a mennyiséget és a pénznem szimbólumot. • 2: Az előjel követi a mennyiséget és a pénznem szimbólumot. • 3: Az előjel közvetlenül megelőzi a pénznem szimbólumot. • 4: Az előjel közvetlenül követi a pénznem szimbólumot. 2.3 localeconv Részletes információt szolgáltat az aktuális helyi numerikus és pénzügyi beállításokról a struct lconv *localeconv(void); függvény. Az információt egy
statikus lconv struktúrában helyezi el, és visszaadja ennek címét. E struktúra tartalmát a következő localeconv, A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 15 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Helyi információ Vissza ◄ 16 ► vagy LC ALL, LC NUMERIC vagy LC MONETARY kategóriás setlocale hívás felülírja. 0 A visszakapott struktúra tagjait ne módosítsuk közvetlenül! 2.4 Példa A HELYINFO.C példa lekérdezi és kijelzi, hogy milyen hely van érvényben a program indulásakor Rendszer alapértelmezett helyet állít, és ezt is kijelzi. Megjeleníti a tizedespont karaktert és a pénznem szimbólumot Végül minimális ANSI konform C helyet rögzít, és demonstrálja ezt is. A példa minden beállított helyen megpróbálkozik a ”3,14” karakterlánc konverziójával, s az átalakítás eredményét meg is jelenteti. #include <stdio.h> #include <stdlib.h> #include
<string.h> #include <locale.h> void main(void){ struct lconv *plconv; char puff[256]; printf("Helyi információ: "); /* A helyi infó lekérdezése: / printf("A program indulásakor: %s ", setlocale(LC ALL, NULL)); printf("atof("3,14") 4.2 pontossággal: %42f ", atof("3,14")); /* Alapértelmezett hely beállítása: / strcpy(puff, setlocale(LC ALL, "")); printf("Rendszer alapértelmezett hely: %s ", puff); printf("atof("3,14") 4.2 pontossággal: %42f ", atof("3,14")); /* Tizedespont és pénznem karakter: / plconv = localeconv(); printf("A nem pénzügyi decimális pont: %s ", plconv->decimal point); printf("A pénznem szimbólum: %s ", plconv->currency symbol); /* A hely visszaállítása C környezetre: / printf("Minimális ANSI konform C hely: %s ", setlocale(LC ALL, "C")); printf("atof("3,14") 4.2
pontossággal: %42f ", atof("3,14")); } A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 16 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Helyi információ Vissza ◄ 17 ► 2.5 Ellenőrző kérdések: • Melyik fejfájlt kell bekapcsolni a szabványos helyi információt beállító, lekérdező rutinok használatához? • Mik a helyi kategóriák? • Mik a paraméterei és a visszaadott értéke a setlocale függvénynek? • Milyen viselkedést befolyásol az LC ALL kategória? • Mire hat az LC COLLATE kategória? • Mit befolyásol az LC CTYPE kategória? • Mit állít be az LC TIME kategória? • Hogyan kérdezhető le egy kategória beállítása? • Hogyan lehet ANSI konform C környezetet állítani, és hogyan lehet alapértelmezés szerinti helyet választani? • Mire való az lconv struktúra, s hogyan lehet lekérdezni és elérni? • Milyen típusú tagjai vannak az lconv
struktúrának, s mit használnak ezek közül a szabványos könyvtár függvényei? • Mire való az LC NUMERIC kategória, és az lconv struktúrának milyen tagjaira hat? • Mire jó az LC MONETARY kategória, és az lconv struktúrának milyen tagjait befolyásolja? • Milyen lconv struktúra tagok, és milyen formában határozzák meg a számjegy csoportok méretét? • Melyik lconv struktúra tagok határozzák meg az előjel pozícióját, és hogyan? 2.6 Megoldandó feladatok: Készítsen programot, mely megjelentet egy kétoszlopos táblázatot! A bal oldali oszlopban a kategóriák látszanak szimbolikus állandók formájában balra zártan, s a jobb oldali oszlop jobbra zártan a megfelelő számértékeket tartalmazza. A táblázat oszlop feliratai: „Kategória” és „Érték” Készítsen void lconvki(struct lconv * mutato); függvényt, mely megjelenteti alkalmas formában a mutato paraméterével elért lconv struktúra tagjait! Írjon kipróbáló
programot is a függvényhez! A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 17 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Többájtos és széles karakterek Vissza ◄ 18 ► 3. Többájtos és széles karakterek Azon ANSI/ISO szabványos függvények, melyek nevébe w (wide – széles), wc (wide character – széles karakter), wcs (wide character string – széles karakterlánc) került, mindig párjuk széles karakteres változatai, és működésük ettől eltekintve egyezik párjukéval. Prototípusaik, a bennük használt típusok és szimbolikus állandók a szabványos WCHAR.H, ill a karakterosztályozóké a WCTYPE.H, fejfájlokban találhatók A helyi információval, a helyi kategóriákkal és a setlocale függvénnyel az előző fejezet foglalkozik! 3.1 Egybájtos karakterek (Single Byte Characters) Az ASCII karakterkészlet a 0x00 – 0x7F tartományban definiál karaktereket. Vannak aztán
Európában olyan karakterkészletek, melyek az ASCII 0x00 – 0x7F tartományát megtartva a 0x80 – 0xFF intervallumra is meghatároznak karaktereket (kódlapokkal). A sok európai nyelvi bővítményt is hozzáértve az ASCII karakterkészlethez 8 bites, vagy egybájtos karakterkészletet (Single-Byte – Character Set: SBCS) kapunk. 3.2 Többájtos karakterek (MultiByte Characters) Néhány nem európai karakterkészletre (például a japán Kanji–ra) is tekintettel, jóval több karakter van, mint amennyit az egybájtos karakterkódolási séma megenged, és ezért van szükség többájtos karakterkódolásra (MultiByte-Character Set: MBCS). A többájtos karakter egy vagy több bájt sorozata, de minden bájt sorozat egyetlen karaktert reprezentál a kibővített karakterkészletben. A többájtos karakter lehet egybájtos (egy karakter az alap C karakterkészletből), lehet kétbájtos, vagy többájtos sorozat. Két vagy többájtos bájtsorozatokat tartalmazó többájtos
kódolás esetén a bájtok értelmezése a konverziós állapottól (conversion state) függ. A konverziós állapotot a bájtsorozatban előbb álló bájt határozza meg a következőre. A kezdeti konverziós állapot szerint, ha a bájt egyezik az alap C karakterkészlet egyik karakterével, akkor a bájt azt a karaktert ábrázolja. Például az EUC kódolás magába foglalja az ASCII–t. A [0xA1, 0xFE] intervallumba eső értékű bájt a kétbájtos sorozat első bájtja, mely sorozat második bájtja köteles a [0x80, 0xFF] értéktartományba esni. Minden más bájt érték egybájtos sorozat. Miután az alap C karakterkészlet minden tag- A dokumentum használata | Tartalomjegyzék | Tárgymutató Vissza ◄ 18 ► Programozás II. A dokumentum használata | Tartalomjegyzék | Tárgymutató Többájtos és széles karakterek Vissza ◄ 19 ► jának bájt értéke a [0x00, 0x7F] ASCII kódtartományba esik, az EUC kielégíti „a többájtos kódolás szabványos
C–ben” követelményeit is. [0xA1, 0xFE] intervallumba eső értékű bájt után azonban nincs kezdeti konverziós állapot, s így az ilyenkor következő [0x00, 0x7F] értékű bájt nem egybájtos sorozat, hanem egy hibás kétbájtos sorozat része. Az előző bekezdés értelmében mind az ASCII, mind a többájtos karakterláncokban 0x00 értékű a karakterláncokat záró, egybájtos null karakter ('