Programiranje Programski jezik C prof.dr.sc. Ivo Ipšić 2009/2010 Sadržaj Ulazno-izlazne funkcije Datoteke Formatirane datoteke Funkcije za rad s datotekama Primjeri Datoteke komunikacija između programa i okoline informacije o datotekama: mjesto zapisa datoteke na disku tip datoteke operacije nad datotekom pristup datotekama struktura tipa FILE, definirana u header datoteci stdio.h
Datoteke deklaracija pokazivača na datoteku FILE *ime_pok_na_datoteku; osnovne operacije otvaranje datoteke čitanje pisanje struktura FILE typedef struct char *buffer; /*pokazivac na adresu medjuspremnika */ char *ptr; /* pokazivac na slijedeci element */ int cnt; /* broj znakova u medjuspremniku */ int flags; /*parametri datoteke */ int fd; /* deskriptor datoteke */ FILE; Pristup podacima u datotekama pokazivač na međuspremnik pokazivač na slijedeći element broj znakova parametri datoteke deskriptor pisanje podataka pisanje podataka čitanje čitanje FILE *pok_na_dat; podataka podataka program međuspremnik datoteka
Datoteke fopen otvara datoteku FILE *fopen( const char *filename, const char *mode ); funkcija vraća pokazivač na otvorenu datoteku ili pokazivač tipa NULL mode r, w, a r čitanje w pisanje a dodavanje zapisa na kraj datoteke fclose zatvara datoteku int fclose( FILE *stream ); funkcija vraća 0 ukoliko je datoteka uspješno zatvorena int fcloseall(); funkcija fcloseall zatvara sve otvorene datoteke u programu čitanje i pisanje znakova fgetc čita znak iz datoteke int fgetc( FILE *stream ); stream pokazivač na strukturu tipa FILE funkcija vraća int pročitanog znaka ili znak EOF fputc piše znak u datoteku int fputc( int c, FILE *stream ); funkcija vraća int upisanog znaka
#include <stdio.h> #include <stdlib.h> void main() int broj_znakova=0; FILE *ulaz; int c; ulaz = fopen("text.txt","r"); if (ulaz == NULL) printf("datoteka ne postoji\n"); c = fgetc(ulaz); while (c!= EOF) broj_znakova++; c = fgetc(ulaz); fclose(ulaz); printf("broj znakova u datoteci: %d\n",broj_znakova); čitanje - fread int fread( void *buffer, int size, int count, FILE *stream ); vraća broj pročitanih jedinica, koji može biti manji od count ukoliko se je došlo do kraja datoteke count je broj jedinica koji se želi pročitati size je veličina jedne jedinice u bajtovima buffer je polje za zapis pročitanih jedinica stream je pokazivač na datoteku pisanje - fwrite intfwrite( const void *buffer, int size, int count, FILE *stream ); vraća broj zapisa count je broj jedinica koji se želi zapisati size je veličina jedne jedinice u bajtovima buffer je polje iz kojega se prenose podaci u datoteku stream je pokazivač na datoteku
čitanje - fread primjer čitanja jednog znaka while (!feof(ulaz)) fread(&c,sizeof(char),1,ulaz); broj_znakova++; funkcija feof vraća 0 ukoliko pokazivač ne pokazuje na kraj datoteke man feof 4.5 `feof'--test for end of file SYNOPSIS #include <stdio.h> int feof(file *FP); DESCRIPTION `feof' tests whether or not the end of the file identified by FP has been reached. RETURNS `feof' returns `0' if the end of file has not yet been reached; if at end of file, the result is nonzero. PORTABILITY `feof' is required by ANSI C. #include <stdio.h> #include <stdlib.h> void main() int broj_znakova=0; FILE *ulaz; int c; ulaz = fopen("text.txt","r"); if (ulaz == NULL) printf("datoteka ne postoji\n"); while (!feof(ulaz)) fread(&c,sizeof(char),1,ulaz); broj_znakova++; fclose(ulaz); printf("broj znakova u datoteci: %d\n",broj_znakova);
čitanje strukture struct osoba int sifra; char prez_ime[20+1]; unsigned int post_br; char adresa[30+1]; zaposlenik; fread(&zaposlenik,sizeof(struct osoba),1,fp); Primjer zapis podataka organiziranih u strukturu struct osoba int sifra; char prez_ime[20+1]; unsigned int post_br; char adresa[30+1]; ; struct osoba zaposlenik[100], zap_osoba; Primjer čitanje zapisa pomoću funkcije scanf i zapis strukture u datoteku for (i=0; i<br; i++) printf("upisi sifru osobe\n"); scanf("%2d", &zaposlenik[i].sifra); printf("upisi prezime osobe\n"); scanf("%s", zaposlenik[i].prez_ime); printf("osoba %2d: %s\n",zaposlenik[i].sifra, zaposlenik[i].prez_ime); fwrite(&zaposlenik[i],sizeof(struct osoba),1,izlaz);
#include <stdio.h> #include <stdlib.h> void main() struct osoba int sifra; char prez_ime[20+1]; unsigned int post_br; char adresa[30+1]; ; struct osoba zaposlenik[100], zap_osoba; int i, br; FILE *izlaz, *ulaz; printf("upisi broj osoba\n "); scanf("%d", &br); if ((izlaz= fopen("zap.txt","w")) == NULL) printf("datoteka se ne moze otvoriti\n"); for (i=0; i<br; i++) printf("upisi sifru osobe\n"); scanf("%2d", &zaposlenik[i].sifra); printf("upisi prezime osobe\n"); scanf("%s", zaposlenik[i].prez_ime); printf("osoba %2d: %s\n",zaposlenik[i].sifra, zaposlenik[i].prez_ime); fwrite(&zaposlenik[i],sizeof(struct osoba),1,izlaz); fclose(izlaz); if ((ulaz= fopen("zap.txt","r")) == NULL) printf("datoteka se ne moze otvoriti\n"); for (i=0; i<br; i++) fread(&zap_osoba,sizeof(struct osoba),1,ulaz); printf("%5d: %s\n",zap_osoba.sifra, zap_osoba.prez_ime); fclose(ulaz); /* kraj funkcije main*/ čitanje cijelog polja zaposlenik i ispis pojedinih elemenata struct osoba int sifra; char prez_ime[20+1]; unsigned int post_br; char adresa[30+1]; zaposlenik[100] ; fread(zaposlenik,sizeof(struct osoba),br,ulaz); for (i=0; i<br; i++) printf("%5d: %s\n", zaposlenik[i].sifra, zaposlenik[i].prez_ime);
Program čita znakove iz datoteke i izpisuje njihovu učestalost u datoteci. #include <stdio.h> #include <stdlib.h> main() struct znakovi int vrijednost_znaka; int ucestalost_znaka; ; struct znakovi frekvencije[256]; int i,broj_znakova=0; FILE *infile; int c; char datoteka[20]; printf("upisi ime datoteke\n"); scanf("%s",datoteka); infile = fopen(datoteka,"rb"); if (infile == NULL) printf("datoteka %s ne postoji\n",datoteka); for (i=0; i<256;i++) frekvencije[i].vrijednost_znaka=i; frekvencije[i].ucestalost_znaka=0; c = fgetc(infile); while (c!= EOF) broj_znakova++; if (c >= ' ') frekvencije[c].ucestalost_znaka++; c = fgetc(infile); fclose(infile); printf("%d znakova u datoteci\n",broj_znakova); for (i=0; i<256;i++) if (frekvencije[i].ucestalost_znaka!= 0) printf("%2c (%2d) = %d\n", i, frekvencije[i].vrijednost_znaka, frekvencije[i].ucestalost_znaka); Čitanje i pisanje znakovnih polja fgets char *fgets( char *string, intn, FILE*stream ); čita znakovno polje (string) maksimalne dužine n fputs int fputs( const char *string, FILE*stream ); #include <stdio.h> #include <stdlib.h> void main() int broj_redka=0; FILE *ulaz, *izlaz; int c; char buffer[255]; ulaz = fopen("text.txt","r"); if (ulaz == NULL) printf("datoteka ne postoji\n"); izlaz = fopen("text_novi.txt","w"); if (izlaz == NULL) printf("datoteka ne postoji\n"); while (fgets(buffer,255,ulaz)) fprintf(izlaz,"%3d %s\n",++broj_redka,buffer); fclose(ulaz); fclose(izlaz);
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void main() 5 6 int broj_redka=0; 7 FILE *ulaz, *izlaz; 8 int c; 9 char buffer[255]; 10 11 ulaz = fopen("text.txt","r"); 12 if (ulaz == NULL) 13 printf("datoteka ne postoji\n"); 14 15 16 izlaz = fopen("text_novi.txt","w"); 17 if (izlaz == NULL) 18 printf("datoteka ne postoji\n"); 19 20 21 22 23 while (fgets(buffer,255,ulaz)) 24 fprintf(izlaz,"%3d %s\n",++broj_redka,buffer); 25 26 27 fclose(ulaz); 28 fclose(izlaz); 29 30 Formatirane datoteke fprintf int fprintf( FILE *stream, const char *format [, argument ]...); fprintfvraća broj bajtova zapisanih u datoteku na koju pokazuje pokazivač stream Čitanje formatiranih datoteka fcanf int fscanf( FILE *stream, const char *format [, argument ]... ); funkcija fcanf vraća broj pročitanih elemenata primjer: float fp; char s[20]; FILE *pok_datoteke; fscanf( pok_datoteke, "%f", &fp ); fscanf( pok_datoteke, "%s", s );
Funkcije za rad s datotekama pomicanje - pozicioniranje u datoteci int fseek( FILE *stream, long offset, intorigin ); pomiće pokazivač offset bajtova u odnosu na origin SEEK_CUR Current position of file pointer SEEK_END End of file SEEK_SET Beginning of file long ftell( FILE *stream ); vraća položaj pokazivača u bajtovima