Programski jezik C - ulaz i izlaz programa
Ulaz i izlaz programa Argumenti komandne linije Standardni tokovi Preusmerenje Funkcije za rad sa ulazom i izlazom Formatiran ulaz/izlaz Datoteke 2
Aргументи командне линије Функција main до сада је дефинисана без аргумената main(), а командна линија којом се позива извршавање програма је садржала само један аргумент назив извршног програма../a.out У општем случају програм може да се позива са више аргумената, на пример./a.out argument1 argument2 argument3 а функција main у том случају може да има аргументе њихове вредности су у тесној вези са бројем и вредностима аргумената командне линије којом се позива извршавање одговарајућег програма 3
Aргументи командне линије У општем случају main се дефинише са два аргумента : argc (ARGument Count) број аргумената у командној линији (број стрингова у позиву извршавања програма, укључујући и име програма), и argv (ARGument Vector) вредности аргумената командне линије сами стрингови, тј. Заглавље функције main има општи облик int main(int argc, char *argv[])) Идентификатори argc, argv су произвољни и могу да се користе и други, на пример, int main (int br_argumenata, char* argumenti[]); 4
Aргументи командне линије int main(int argc, char *argv[ ])) argc добија вредност једнаку броју аргумената (рачунајући и само име датотеке извршног програма то је argv[0]), argv[1] је једнак првом опционом аргументу (који се наводи иза имена извршне датотеке), argv[2] је једнак другом опционом аргументу, итд. На пример, при позиву програма са три аргумента./a.out argument1 argument2 argument3 аrgc је 4, argv[0] је./a.out, argv[1] је argument1, argv[2] је argument2 а argv[3] је argument3 int main() argc је 1, argv[0] је име програма, argv[1] је NULL 5
Aргументи командне линије - пример #include <stdio.h> int main(int argc, char* argv[]) { int i; printf("argc = %d\n", argc); /* Nulti argument uvek je ime programa (na primer, a.out) */ for (i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]); return 0; } 6
Provera da li je program pokrenut sa argumentima Primer: program koristi 2 argumenta... if(argc<3) { printf("neispravno pokretanje programa\n"); return 1; } printf("argv[1]= %s argv[2]= %s\n", argv[1], argv[2]); 7
Standardni ulaz / izlaz Standardna biblioteka <stdio.h> Implementira jednostavan model tekstualnog ulaza i izlaza Ulaz i izlaz se modeluju tzv. tokovima (engl. stream) podataka (obično pojedinačnih bajtova ili karaktera) Standardni ulaz obično čine podaci koji se unose sa tastature Podaci koji se šalju na standardni izlaz obično se prikazuju na ekranu Standardni izlaz za greške šalju se poruke o greškama obično na ekran 8
Preusmeravanje (redirekcija) Moguće je izvršiti preusmeravanje (redirekciju) standardnog ulaza na neku datoteku Na primer, ukoliko se program pokrene sa./prog < indat onda program prog čita karaktere iz datoteke indat, umesto sa tastature 9
Preusmeravanje Preusmeravanje (redirekcija) standardnog izlaza u neku datoteku Na primer, ukoliko se program pokrene sa./prog > outdat onda program prog upisuje karaktere u datoteku outdat, umesto na ekran (poruke o greškama se još uvek ispisuju na ekran!) 10
Preusmeravanje Za preusmerenje izveštaja o greškama sa standardnog izlaza na datoteku, npr errordat koristi se operator preusmerenja 2> Na primer, prog > outdat 2> errordat 11
Funkcije za ulaz / izlaz jednog karaktera Funkcija int getchar(void); vraća sledeći karakter sa ulaza ili EOF kada dođe do kraja toka Funkcija int putchar(int c); štampa karakter c na standardni izlaz, a vraća karakter koji je ispisala ili EOF ukoliko je došlo do greške 12
Funkcije za ulaz / izlaz jednog karaktera #include <stdio.h> int main () { char c; printf("enter character: "); c = getchar(); printf("character entered: "); putchar(c); return(0); } 13
Linijski ulaz / izlaz Bibliotečka funkcija char* gets(char* s); čita karaktere sa standardnog ulaza do kraja tekuće linije ili do kraja datoteke i karaktere smešta u nisku s Oznaka kraja reda se ne smešta u nisku, a niska se automatski završava nulom U slučaju da je ulaz uspešno pročitan, gets vraća s, a inače vraća NULL pokazivač 14
Linijski ulaz / izlaz int main () { char str[50]; printf("enter a string : "); gets(str); printf("you entered: %s", str); return(0); } 15
Linijski ulaz / izlaz Bibliotečka funkcija int puts(const char* s); ispisuje nisku na koju ukazuje s na standardni izlaz, dodajući pri tom oznaku za kraj reda Završna nula se ne ispisuje Funkcija puts vraća EOF u slučaju da je došlo do greške, a nenegativnu vrednost inače 16
Linijski ulaz / izlaz #include <stdio.h> #include <string.h> int main () { char str1[15]; char str2[15]; strcpy(str1, "tutorialspoint"); strcpy(str2, "compileonline"); puts(str1); puts(str2); return(0); } 17
Formatiran ulaz / izlaz Funkcije printf i scanf Funkcija printf prevodi vrednosti osnovnih tipova podataka u niske karaktera i usmerava ih na standardni izlaz Funkcija vraća broj odštampanih karaktera Format niska sadrži dve vrste objekata: obične karaktere - doslovno se prepisuju na standardni izlaz i specifikacije konverzija - proizvode konverziju i štampanje odgovarajućeg argumenta funkcije printf 18
Formatiran ulaz / izlaz (codingunit.com) #include<stdio.h> main() { int a,b; float c,d; a = 15; b = a / 2; printf("%d\n",b); printf("%3d\n",b); printf("%03d\n",b); c = 15.3; d = c / 3; printf("%3.2f\n",d); } 19
Formatiran ulaz / izlaz #include<stdio.h> main() { printf("the color: %s\n", "blue"); printf("first number: %d\n", 12345); printf("second number: %04d\n", 25); printf("third number: %i\n", 1234); printf("float number: %3.2f\n", 3.14159); printf("hexadecimal: %x\n", 255); printf("octal: %o\n", 255); printf("unsigned value: %u\n", 150); printf("just print the percentage sign %%\n", 10); } 20
Formatiran ulaz / izlaz Funkcija scanf čita karaktere sa standardnog ulaza, interpretira ih na osnovu specifikacije navedene format niskom i smešta rezultat na mesta određena ostalim argumentima Funkcija scanf prestaje sa radom kada iscrpi svoju format nisku ili kada neki deo ulaza ne može da se uklopi u shemu navedenu format niskom Funkcija vraća broj uspešno dodeljenih podataka Vrednost 0 se vraća u slučaju da tekući karakter sa ulaza ne može da se uklopi u prvu specifikaciju zadatu format niskom 21
Formatiran ulaz / izlaz Ulaz iz niske i izlaz u nisku: funkcije sprintf i sscanf int sprintf(char *string, const char *format,...) int sscanf(const char* input, const char* format,...) 22
Datoteka Datoteka je niz bajtova Za razliku od preusmeravanja, veći broj ulaza / izlaza uz standardni Binarne i tekstualne datoteke Različiti načini pristupa datotekama 23
Tekstualne datoteke Sadržaj tekstualne datoteke čine vidljivi karakteri, oznaka kraja reda i tabulator Tekstualne datoteke se obično obrađuju red po red (liniju po liniju) Na nekim sistemima kraj reda: dva karaktera (na primer, \r\n na sistemima Windows) jednim karakterom (na primer, sa \n na sistemu Linux) 24
Tekstuelne datoteke C jezik nudi tekstualni mod rada sa datotekama: Pri čitanju i upisu u datoteku vrši se konverzija iz podrazumevanog formata označavanja kraja reda u jedinstven karakter \n Na Windows sistemima: dva karaktera \r\n na kraju reda čitaju se kao \n kada se u datoteku C-programom upisuje \n biće upisana dva karaktera \r\n 25
Binarne datoteke Drugi način pristupa datotekama prilagođen je datotekama čiji sadržaj ne predstavlja tekst i u kojima se mogu naći bajtovi svih vrednosti od 0 do 255 (na primer, jpg ili zip datoteke) Za obradu ovakvih datoteka, jezik C nudi binarni mod rada sa datotekama U ovom slučaju nema nikakve konverzije i interpretiranja karaktera prilikom upisa i čitanja i svaki bajt koji postoji u datoteci se čita doslovno 26
fopen Sve potrebne deklaracije za rad sa datotekama nalaze se u zaglavlju <stdio.h> Da bi se pristupilo datoteci potrebno je povezati je sa programom Bibliotečka funkcija fopen: FILE* fopen(const char* filename, const char* mode); Funkcija fopen dobija kao prvi argument nisku koja sadrži ime datoteke i vraća pokazivač na strukturu koja sadrži sve potrebne informacije o datoteci Pokazivač na strukturu tipa FILE treba da se prosleđuje svim funkcijama koje pristupaju datoteci 27
Fopen - mod Drugi argument funkcije je niska karaktera koja predstavlja način (mod) otvaranja datoteke Ukazuje na to kako će se datoteka koristiti Dozvoljeni modovi uključuju čitanje (read, "r"), pisanje (write, "w") i dopisivanje (append, "a") Ako se datoteka koja ne postoji na sistemu otvara za pisanje ili dopisivanje, onda se ona kreira Ako se postojeća datoteka otvara za pisanje, njen stari sadržaj se briše; ako se otvara za dopisivanje, novi sadržaj se upisuje iza starog 28
Fopen - mod Ako se nepostojeća datoteka otvara za čitanje, dolazi do greške U slučaju greške funkcija fopen vraća NULL Modovi r+, w+ i a+ ukazuju da se datoteka otvara i za čitanje i za pisanje (ili dopisivanje) Binarna datoteke se otvara tako što se na mod dopisuje "b" (na primer, rb, wb, a+b,... ) 29
fclose Kada se C program pokrene, operativni sistem otvara tri toka podataka (standardni ulaz, stadnardni izlaz i standardni izlaz za greške) kao da su datoteke Obezbeđuje pokazivače kojima im se može pristupati Funkcija FILE* stdin; FILE* stdout; FILE* stderr; int fclose(file *fp) prekida vezu između programa i datoteke koju je funkcija fopen ostvarila Dobra je praksa zatvarati datoteke čim prestanu da budu potrebne (ograničenje broja otvorenih datoteka) 30
Primer strukture programa int main(){ FILE *ulaz, *izlaz; ulaz = fopen("ulazna.txt","r"); if(ulaz == NULL) { printf("greska pri otvaranju ulazne datoteke\n"); return -1; } izlaz = fopen("izlazna.txt","w"); if(izlaz == NULL) { printf("greska pri otvaranju izlazne datoteke\n"); return -1; }... fclose(ulaz); fclose(izlaz); return 0; } 31
Datoteka čitanje i upis Čitanje i pisanje sadržaja u datoteku može da se vrši na različite načine Za tekstualne datoteke: karakter po karakter, linija po linija, formatiran ulaz / izlaz Funkcija int getc(file *fp) vraća naredni karakter iz datoteke određene FILE pokazivačem ili EOF u slučaju kraja datoteke ili greške Funkcija int putc(int c, FILE *fp); upisuje dati karakter u datoteku određenu FILE pokazivačem i vraća upisani karakter ili EOF u slučaju greške 32
Feof i ferror Funkcija int feof(file *fp) vraća vrednost tačno (nenula) ukoliko se došlo do kraja date datoteke Funkcija int ferror(file *fp) vraća vrednost tačno (nenula) ukoliko je došlo do greške u radu sa datotekom 33
fgets Funkcija char *fgets(char *line, int maxline, FILE *fp) čita jednu liniju (uključujući oznaku kraja reda) iz datoteke fp i rezultat smešta u nisku line Može da se pročita najviše maxline-1 karaktera Rezultujuća niska završava se karakterom \0 U normalnom toku izvršavanja, funkcija fgets vraća pokazivač na početak linije, a u slučaju kraja datoteke ili greške vraća NULL 34
fputs Funkcija int fputs(const char *line, FILE *fp) ispisuje nisku (ne mora da sadrži oznaku kraja reda) u datoteku Vraća EOF ako dođe do greške, a neki nenegativan broj inače 35
gets / puts Za razliku od funkcija fgets i fputs, funkcija gets briše završni \n, a funkcija puts ga dodaje 36
Formatirani ulaz i izlaz Za formatirani ulaz i izlaz u / iz datoteke mogu se koristiti funkcije fscanf i fprintf Identične funkcijama scanf i printf, osim što je prvi argument pokazivač tipa FILE koji ukazuje na datoteku iz koje se čita, odnosno u koju se piše Format niska je drugi argument int fscanf(file *fp, const char *format,...) int fprintf(file *fp, const char *format,...) 37
fprintf fscanf(stdin, "%d", &a); <=> scanf("%d", &a); fprintf(stdout, "%d\n",a); <=> printf("%d\n",a); fprintf(stderr, "Neispravan unos!\n"); 38
Binarne datoteke Funkcija fread se koristi za čitanje niza slogova iz binarne datoteke Funkcija fwrite za pisanje niza slogova u binarnu datoteku size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 39
Funkcije direktnog pristupa fseek, ftell Funkcija fseek služi za pozicioniranje na mesto u datoteci sa koga će biti pročitan ili na koje će biti upisan sledeći podatak Funkcija ftell vraća trenutnu poziciju u datoteci (u obliku pomeraja od početka izraženog u broju bajtova) Iako primena funkcija ftell i fseek nije striktno ograničena na binarne datoteke, one se najčešće koriste sa binarnim datotekama 40
Функције директног приступа датотекама: fseek int fseek(file *stream, long offset, int origin) Вредност originможе бити SEEK_SET (почетак датотеке), SEEK_CUR (текућа позиција у датотеци) или SEEK_END (крај датотеке). Ове вредности су константе дефинисане у <stdio.h>. Функција fseek враћа вредност 0 ако је позиционирање успешно, а вредност различиту од 0 у случају грешке 41
Функције директног приступа датотекама: ftell long int ftell(file *stream) <stdio.h> Враћа текућу вредност индикатора позиције у датотеци којој је придружен показивач stream. -1L у случају грешке 42
Бинарне датотеке: пример 1 #include <stdio.h> #include <string.h> int main () { FILE *fp; char c[] = "this is tutorialspoint, buffer[100]; /* Open file for both reading and writing */ fp = fopen("file.txt", "w+b"); /* Write data to the file */ fwrite(c, strlen(c) + 1, 1, fp); /* Seek to the beginning of the file */ fseek(fp, 0, SEEK_SET); /* Read and display data */ fread(buffer, strlen(c)+1, 1, fp); printf("%s\n", buffer); fclose(fp); return(0); } 43
Бинарне датотеке: пример 2 #include <stdio.h> int main() { struct S { int broj; int kvadrat; } s; FILE* f; int i; if ((f = fopen("junk", "r+b")) == NULL) { fprintf(stderr, "Greska prilikom otvaranja datoteke"); return 1;} for (i = 1; i <= 5; i++) { s.broj = i; s.kvadrat = i*i; fwrite(&s, sizeof(struct S), 1, f);} printf("upisano je %ld bajtova\n", ftell(f)); fclose(f); } 44
Текстуална датотеке: пример Пример: #include <stdio.h> int main() { FILE *fp; fp=fopen( izlaz.txt, w ); fputs( This is an apple., fp); fseek(fp, 9, SEEK_SET); fputs( sam, fp); fclose(fp); return 0; } This is an apple. This is a sample. 45