Sunteți pe pagina 1din 5

Citirea si scrierea in C Citire cu format

Nume scanf, fscanf, sscanf - citire cu format


Declaraie int scanf(const char *format, ...); Descriere Familia de funcii scanf scaneaz intrarea n concordan cu irul de caractere format dup cum se descrie mai jos. Acest format poate conine specificatori de conversie; rezultatele unor astfel de conversii dac se efectueaz! se memoreaz prin intermediul ar"umentelor pointer. Funcia scanf citete irul de intrare din flu#ul standard stdin, fscanf din flux, i sscanf din irul indicat de str. Fiecare ar"ument pointer tre$uie s corespund n ordine ca tip cu fiecare specificator de conversie %oate conversiile sunt introduse de caracterul %. &irul format poate conine i alte caractere. 'paii al$e $lanc, ta$, sau ne(-line! din irul format se potrivesc cu orice spaiu al$ n orice numr din irul de intrare. )rice alte caractere tre$uie s se potriveasc e#act. 'canarea se oprete atunci cnd un caracter din irul de intrare nu se potrivete cu cel din format. 'canarea se oprete de asemenea atunci cnd o conversie nu se mai poate efectua. *onversii Dup caracterul % care introduce o conversie poate urma un numr de caractere indicatori, dup cum urmeaz+ * h l L 'uprim atri$uirea. *onversia care urmeaz se face n mod o$inuit, dar nu se folosete nici un ar"ument pointer; rezultatul conversiei este pur i simplu a$andonat. *onversia este de tip dioux sau n i ar"umentul asociat este un pointer la short n loc de int!. *onversia este de tip dioux sau n i ar"umentul asociat este un pointer la long n loc de int!, sau conversia este de tip efg i ar"umentul asociat este un pointer la double n loc de float!. *onversia este de tip efg i ar"umentul asociat este un pointer la long double.

,n completare la aceti indicatori poate e#ista o mrime w ma#im opional pentru cmp, e#primat ca un ntre" zecimal, ntre caracterul % i cel de conversie, i naintea indicatorului. Dac nu este dat o mrime ma#im se folosete mrimea implicit infinit cu o e#cepie la conversia de tip c!; n caz contrar se scaneaz cel mult un numr de w caractere n timpul conversiei. ,nainte de a ncepe o conversie, majoritatea conversiilor i"nor spaiile al$e; acestea nu sunt contorizate n mrimea campului. 'unt disponi$ile urmtoarele conversii+ % d -otrivire cu un caracter %. *u alte cuvinte, %% n irul format tre$uie s se potriveasc cu un caracter %. Nu se efectueaz nici o conversie i nici o atri$uire. -otrivire cu un ntre" zecimal eventual cu semn!; ar"umentul asociat tre$uie s fie un pointer la int.

-otrivire cu un ntre" eventual cu semn!; ar"umentul asociat tre$uie s fie un pointer la int. .aloarea ntrea" este citit n $aza /0 dac ncepe cu 0x sau 0X, n $aza 1 dac ncepe cu 0, i n $aza /2 n caz contrar. 'unt folosite numai caracterele care corespund $azei respective. -otrivire cu un ntre" octal fr semn; ar"umentul asociat tre$uie s fie un pointer la unsigned. -otrivire cu un ntre" zecimal fr semn; ar"umentul asociat tre$uie s fie un pointer la unsigned. -otrivire cu un ntre" 3e#azecimal fr semn; ar"umentul asociat tre$uie s fie un pointer la unsigned. -otrivire cu un numr n vir"ul mo$il eventual cu semn!; ar"umentul asociat tre$uie s fie un pointer la float. -otrivire cu o secven de caractere diferite de spaiu al$; ar"umentul asociat tre$uie s fie un pointer la char, i zona tre$uie s fie suficient de mare pentru a putea primi toat secvena i caracterul terminator null. &irul de intrare se termin la un spaiu al$ sau la atin"erea mrimii ma#ime a campului prima condiie ntlnit!. -otrivire cu o secven de caractere de mrime w dac aceasta este specificat; prin lips se ia w= /!; ar"umentul asociat tre$uie s fie un pointer la char, i zona tre$uie s fie suficient de mare pentru a putea primi toat secvena nu se adau" terminator null!. Nu se i"nor ca de o$icei spaiile al$e din fa. -entru a i"nora mai nti spaiile al$e se indic un spaiu e#plicit n format. -otrivire cu o secven nevid de caractere din setul specificat de caractere acceptate; ar"umentul asociat tre$uie s fie un pointer la char, i zona tre$uie s fie suficient de mare pentru a putea primi toat secvena i caracterul terminator null. Nu se i"nor ca de o$icei spaiile al$e din fa. &irul de intrare va fi format din caractere aflate n sau care nu se afl n! setul specificat n format; setul este definit de caracterele aflate ntre [ i ]. 'etul e#clude acele caractere dac primul caracter dup [ este ^. -entru a include caracterul ] n set, acesta tre$uie s fie primul caracter dup [ sau ^; caracterul ] aflat n orice alt poziie nc3ide setul. *aracterul - are i el un rol special+ plasat ntre dou alte caractere adau" toate celelalte caractere aflate n intervalul respectiv la set. -entru a include caracterul - acesta tre$uie s fie ultimul caracter nainte de ]. De e#emplu, "%[^ 0!"! " semnific setul orice caracter cu excepia ], 0 pn la 9, i -. &irul se termin la apariia unui caracter care nu se afl sau, dac se precizeaz ^, care se afl! n set sau dac se atin"e mrimea ma#im specificat. -otrivire cu o valoare pointer aa cum se afieaz cu %p n #rintf!; ar"umentul asociat tre$uie s fie un pointer la pointer. Nu se prelucreaz nimic din irul de intrare; n sc3im$, numrul de caractere consumate pn la acest punct din irul de intrare este memorat la ar"umentul asociat, care tre$uie s fie un pointer la int.

o u x f

e,g 4c3ivalent cu f. s

p n

.alori returnate Funciile returneaz numrul de valori atri$uite, care poate fi mai mic dect numrul de ar"umente pointer, sau c3iar zero, n cazul n care apar nepotriviri ntre format i irul de intrare. 5ero indic faptul c, c3iar dac avem un ir de intrare disponi$il, nu s-a efectuat nici o conversie i atri$uire!; aceast situaie apare atunci cnd un caracter din irul de intrare este invalid, cum ar fi un caracter alfa$etic pentru o conversie %d. .aloarea $%& este returnat dac apare un eroare nainte de prima conversie, cum ar fi detectarea sfritului de fiier. Dac o eroare sau un sfrit de fiier apare dup ce o conversie a nceput, se returneaz numrul de conversii efectuate cu succes.

4#emplu+
int a; long int b; unsigned int c; float d; double e; long double f; char s['00 ; scanf("%d", (a); )) memorea*a un intreg scanf(" %d", (a); )) sterge orice s#atiu, a#oi memorea*a un intreg scanf("%s", s); )) memorea*a un string scanf("%+f", (f); )) memorea*a un long double

11.5. Scriere cu format


Nume printf, fprintf, sprintf - scriere cu format
Declaraie int #rintf(const char *format, ...); int f#rintf(&,+$ *flux, const char *format, ...); int s#rintf(char *str, const char *format, ...); Descriere Funciile din familia printf "enereaz o ieire n concordan cu format dup cum se descrie mai jos. Funcia #rintf afieaz ieirea la flu#ul standard stdout; f#rintf scrie ieirea la flux; s#rintf scrie ieirea n irul de caractere str. Aceste funcii "enereaz ieirea su$ controlul irului format care specific cum se convertesc ar"umentele pentru ieire. &irul de formatare &irul format este un ir de caractere, printre care se pot afla zero sau mai multe directive+ caractere o$inuite diferite de %! care sunt copiate aa cum sunt n flu#ul de ieire, i specificaii de conversie, fiecare dintre ele rezultnd din ncrcarea a zero sau mai multe ar"umente. Fiecare specificaie de conversie este introdus de caracterul % i se termin cu un specificator de conversie. ,ntre acestea pot fi zero sau mai muli indicatori, o mrime minim a campului opional, o precizie opional i un modificator opional de lun"ime. Ar"umentele tre$uie s corespund n ordine cu specificatorii de conversie. Acestea sunt folosite n ordinea dat, unde fiecare caracter * i fiecare specificator de conversie solicit urmtorul ar"ument. Dac ar"umentele nu sunt suficiente comportamentul pro"ramului este imprevizi$il. *aractere indicatori *aracterul % este urmat de zero, unul sau mai muli indicatori+ # .aloarea numeric se convertete n format alternativ. -entru conversii de tip o, primul caracter al irului de ieire este zero prin prefi#are cu 0 dac valoarea nu este zero!. -entru conversii de tip x i X, o valoare nenul este prefi#at cu 0x sau 0X pentru conversii de tip X!. -entru conversii de tip e, E, f, F, g i , rezultatul va conine ntotdeauna punctul zecimal, c3iar dac nu apare partea fracionar n mod normal punctul zecimal apare n aceste conversii numai dac e#ist i partea

fracionar!. -entru conversii de tip g i zerourile finale nu sunt eliminate aa cum se procedeaz n mod normal. -entru alte conversii rezultatul este nedefinit. 0 .aloarea numeric este convertit cu zerouri la stn"a. -entru conversii de tip d, i, o, u, x, X, e, E, f, F, g i , valoarea convertit este completat cu zerouri la stn"a n loc de $lanc. Dac apar indicatorii 0 i - mpreun, indicatorul 0 este i"norat. Dac pentru o conversie numeric d, i, o, u, x, X! este dat o precizie, indicatorul 0 este i"norat. -entru alte conversii rezultatul este nedefinit. .aloarea convertit este aliniat la stn"a implicit alinierea se face la dreapta!. *u e#cepia conversiilor de tip n, valoarea convertit este completat la dreapta cu $lanc, n loc s fie completat la stn"a cu $lanc sau zero. Dac apar indicatorii 0 i - mpreun, indicatorul 0 este i"norat.

Sp spaiu! ,n cazul unui rezultat al unei conversii cu semn, naintea unui numr pozitiv sau ir vid se pune un $lanc. ! 'emnul - sau !! este plasat naintea numrului "enerat de o conversie cu semn. 6mplicit semnul este folosit numai pentru numere ne"ative. Dac apar indicatorii ! i Sp mpreun, indicatorul Sp este i"norat.

7imea campului 8n ir de cifre zecimale cu prima cifr nenul! specific o lime minim pentru cmp. Dac valoarea convertit are mai puine caractere dect limea specificat, va fi completat cu spaii la stn"a sau dreapta, dac s-a specificat aliniere la stn"a!. ,n locul unui numr zecimal se poate folosi * pentru a specifica faptul c limea campului este dat de ar"umentul urmtor, care tre$uie s fie de tip int. ) valoare ne"ativ pentru lime este considerat un indicator - urmat de o valoare pozitiv pentru lime. ,n nici un caz nu se va trunc3ia cmpul; dac rezultatul conversiei este mai mare dect limea campului, cmpul este e#pandat pentru a conine rezultatul conversiei. -recizia -recizia opional! este dat de caracterul . urmat de un ir de cifre zecimale. ,n locul irului de cifre zecimale se poate scrie * pentru a specifica faptul c precizia este dat de ar"umentul urmtor, care tre$uie s fie de tip int. Dac precizia este dat doar de ., sau dac precizia este ne"ativ, atunci aceasta se consider zero. -recizia d numrul minim de cifre care apar pentru conversii de tip d, i, o, u, x, X, numrul de cifre care apar dup punctul zecimal pentru conversii de tip e, E, f, F, numrul ma#im de cifre semnificative pentru conversii de tip g i , sau numrul ma#im de caractere "enerate pentru conversii de tip s. 9odificator de lun"ime ,n acest caz prin conversie ntrea" nele"em conversie de tip d, i, o, u, x, X. h l L *onversia ntrea" care urmeaz corespunde unui ar"ument short sau unsigned short, sau urmtoarea conversie de tip n corespunde unui ar"ument de tip pointer la short. *onversia ntrea" care urmeaz corespunde unui ar"ument long sau unsigned long, sau urmtoarea conversie de tip n corespunde unui ar"ument de tip pointer la long. 8rmtoarea conversie de tip e, E, f, g sau corespunde unui ar"ument long double.

'pecificator de conversie 8n caracter care specific tipul conversiei care se va face. 'pecificatorii de conversie i semnificaia lor sunt+ d,i Ar"umentul de tip int este convertit la notaia zecimal cu semn. -recizia, dac este dat, de numrul minim de cifre care tre$uie s apar; dac valoarea convertit necesit mai puine cifre, aceasta este completat la stn"a cu zerouri. -recizia implicit este /. Dac valoarea 2 este afiat cu precizie e#plicit 2, ieirea este vid.

o,u,x,X Ar"umentul de tip unsigned este convertit la notaie octal fr semn o!, zecimal fr semn u!, sau 3e#azecimal fr semn x i X!. 7iterele abcdef se folosesc pentru conversii de tip x; literele ./01$& pentru conversii de tip X. -recizia, dac este dat, d numrul minim de cifre care tre$uie s apar; dac valoarea convertit necesit mai puine cifre, aceasta este completat la stn"a cu zerouri. -recizia implicit este /. Dac valoarea 2 este afiat cu precizie e#plicit 2, ieirea este vid. e,E ) conversie de tip E folosete litera $ n loc de e! pentru a introduce e#ponentul. 4#ponentul are ntotdeauna cel puin dou cifre; dac valoarea este zero, e#ponentul este 00. f,F Ar"umentul de tip flotant este rotunjit i convertit n notaie zecimal, unde numrul de cifre dup punctul zecimal este e"al cu precizia specificat. Dac precizia lipsete se consider 0; dac precizia este e#plicit zero, punctul zecimal nu apare. Dac punctul zecimal apare, cel puin o cifr apare naintea acestuia. g, Ar"umentul de tip flotant este convertit n stil f sau e sau E pentru conversii de tip !. -recizia specific numrul de cifre semnificative. Dac precizia lipsete se consider 0; dac precizia este zero se consider /. 'tilul e este folosit dac e#ponentul rezultat n urma conversiei este mai mic dect : ori mai mare sau e"al cu precizia. 5erourile finale sunt eliminate din partea fracionar a rezultatului; punctul zecimal apare numai dac este urmat de cel puin o cifr. c s Ar"umentul de tip int este convertit la unsigned char i se scrie caracterul rezultat. Ar"umentul de tip const char * este un pointer la un ir de caractere. *aracterele din ir sunt scrise pn la fr a include! caracterul terminator null; dac precizia este specificat, nu se scrie un numr mai mare dect cel specificat. Dac precizia este dat, nu e nevoie de caracterul null; dac precizia nu este specificat, sau dac este mai mare dect mrimea irului, irul tre$uie s conin un caracter terminator null. Ar"umentul de tip pointer este scris n 3e#azecimal; formatul este specific sistemului de calcul. Numrul de caractere scrise pn n acest moment este memorat la ar"umentul de tip int *. Nu se face nici o conversie. 'e scrie un caracter %. Nu se face nici o conversie. 'pecificaia complet este %%.

p n %

4#emplu+

2include 3stdio.h4 int main() 5 #rintf ("0aractere6 %c %c 7n", 8a8, 9:); #rintf (";ecimale6 %d %ld7n", <0'', 9:0000+); #rintf ("=recedat cu s#atii6 %'0d 7n", <0''); #rintf ("=recedat cu *erouri6 %0'0d 7n", <0''); #rintf (">ome different radixes6 %d %x %o %2x %2o 7n", '00, '00, '00, '00, '00); #rintf ("intregi6 %?.<f %-.0e %$ 7n", @.'?'9, @.'?'9, @.'?'9); #rintf ("%s 7n", ". string"); return 0; A