Przykład
Transkrypt
Przykład
Katedra Elektrotechniki Teoretycznej i Informatyki wykład 11 - sem.III Dr inż. M. Czyżak Język ANSI C-pliki Przykład. Program zapisujący 3 liczby typu int do pliku i następnie je odczytujący (cz.1) #include <stdio.h> #include <conio.h> int main() { int i1=5,i2=10,i3=15,buf; FILE *fp; fp=fopen("Plik1.dat","w+b"); if (fp==NULL) { printf("\n Plik nie daje sie utworzyc"); system("pause"); return 1; } Język ANSI C-pliki aa Przykład. Program zapisujący 3 liczby typu int do pliku i następnie je odczytujący (cz.2) fwrite(&i1,sizeof(int),1,fp); fwrite(&i2,sizeof(int),1,fp); fwrite(&i3,sizeof(int),1,fp); fseek(fp,0,SEEK_SET); fread(&buf,sizeof(int),1,fp); printf("\n Element nr 1 =%d",buf); fread(&buf,sizeof(int),1,fp); printf("\n Element nr 2 =%d",buf); fread(&buf,sizeof(int),1,fp); printf("\n Element nr 3 =%d\n",buf); fclose(fp); system("pause"); return 1;} Język ANSI C – pliki Przykład. Program zapisujący tablicę liczb typu double do pliku i następnie ją odczytujący-wersja I (cz.1) #include <stdio.h> #include <conio.h> int main() {int i; double buf, tab[5]={ 1.5,-1,2,3.2,5.1}; FILE *fp; fp=fopen("Plik2.dat","w+b"); for (i=0;i<5;i++) // Zapis 5 liczb do pliku fwrite(&tab[i],sizeof(double),1,fp); fclose(fp); // zamiast zamykania i ponownego //otwierania //lub rewind. można użyć fseek(fp,0,0) Język ANSI C – pliki Przykład. Program zapisujący tablicę liczb typu double do pliku i następnie ją odczytujący (cz.2) fp=fopen("Plik2.dat","r+b"); for (i=0;i<5;i++)// Odczyt 5 liczb z pliku { fread(&buf,sizeof(double),1,fp); printf("\n Element pliku nr %d =%5.2f",i,buf); } fclose(fp); getch(); return 0; } Język ANSI C – pliki Przykład. Program zapisujący tablicę liczb typu double do pliku i następnie ją odczytujący - wersja II, użycie zapisu i odczytu blokowego dla kilku bloków. (cz.1) #include <stdio.h> #include <conio.h> int main() {int i; double tabBuf[5], tab[5]={ 1.5,-1,2,3.2,5.1}; FILE *fp; fp=fopen("Plik3.dat","w+b"); fwrite(tab,sizeof(double),5,fp); fclose(fp); Język ANSI C – plik Przykład. Program zapisujący tablicę liczb typu double do pliku i następnie ją odczytujący - wersja II, użycie zapisu i odczytu blokowego dla kilku bloków. (cz.2) fp=fopen("Plik2.dat","r+b"); // Odczyt 5 liczb z pliku fread(tabBuf,sizeof(double),5,fp); for (i=0;i<5;i++) printf("\n Element pliku nr %d =%5.2f",i,tabBuf[i]); fclose(fp); getch(); return 0; } Język ANSI C – pliki Wyznaczanie rozmiaru pliku Rozmiar pliku jest mierzony w bajtach. Bajt jest najmniejszą jednostką zapisywaną do pliku lub odczytywaną z pliku. Przy wyznaczaniu długości można wykorzystać funkcję ftell zwracąjącą bieżącą pozycję wskaźnika pliku. Jeśli wskaźnik pliku jest ustawiony na końcu pliku, funkcja ftell podaje liczbę bajtów w pliku, czyli rozmiar w pliku. Algorytm. Wyznaczanie długości pliku (plik otwarty). 1. Ustaw wskaźnik pliku na końcu pliku. 2. Wywołaj funkcję ftell. Język ANSI C – pliki Przykład. Wyznaczanie długości pliku. #include <stdio.h> #include <conio.h> int main() {int i, liczbaBajtow, liczbaElementow; double x[5]={ 2.3,0,22,1.2,5.3}; FILE *fp; fp=fopen("Plik3.dat","r+b"); fseek(fp,0,SEEK_END); liczbaBajtow=ftell(fp); liczbaElementow=liczbaBajtow/sizeof(double); printf("\n Liczba bajtow:%d",liczbaBajtow); printf("\n Liczba elementow :%d",liczbaElementow); fclose(fp); } Język ANSI C – pliki Przykład. Obliczanie w pliku sum elementów dodatnich, ujemnych i ilości elementów zerowych.(cz.1) #include <stdio.h> #include <conio.h> int main() { double sumD=0,sumU=0,ilZer=0,buf; FILE *fp; fp=fopen("Plik3.dat","r+b"); // wersja 1 fseek(fp,0,SEEK_END); iloscElementow=ftell(fp)/sizeof(double); printf("\n Ilosc elementow pliku=%d",iloscElementow); fseek(fp,0,SEEK_SET); Język ANSI C – pliki Przykład. Obliczanie w pliku sum elementów dodatnich, ujemnych i ilości elementów zerowych. (cz.2) for (i=0;i< iloscElementow;i++) { fread(&buf,sizeof(double),1,fp); if (buf>0) sumaD+=buf; if (buf<0) sumaU+=buf; if (buf==0) ilZer++; } printf("\n Suma el. dodatnich :%5.2f",sumaD); printf("\n Suma el. ujemnych printf("\n Ilosc zer :%5.2f",sumaU); :%5.2f",ilZer); Języksum ANSIelementów C – pliki dodatnich, ujemnych i Przykład. Obliczanie w pliku ilości elementów zerowych. (cz.3) // wersja 2 bez wyznaczania dlugosci pliku fseek(fp,0,SEEK_SET); while( fread(&buf,sizeof(double),1,fp)) { if (buf>0) sumaD+=buf; if (buf<0) sumaU+=buf; if (buf==0) ilZer++; } printf("\n Suma el. dodatnich :%5.2f",sumaD); printf("\n Suma el. ujemnych printf("\n Ilosc fclose(fp); getch(); return 0; } zer :%5.2f",sumaU); :%5.2f",ilZer); Język ANSI C – pliki Konstrukcja while( fread(&buf,sizeof(double),1,fp)) { ........ } umożliwia odczyt pliku bez wyznaczania długości pliku. Funkcję fread zwraca wartość różną od zera, dopóki nie zostanie osiągnięty koniec pliku. Wartość różna od zera reprezentuje wartość logiczną prawda, co powoduje, że pętla while wykonuje kolejne iteracje umożliwiające odczytywanie danych aż do momentu osiągnięcia końca pliku. Język ANSI C-pliki Przykład. Program wyszukujący w pliku wartość minimalną i maksymalną.(cz.1) #include <stdio.h> #include <conio.h> int main() {int i; double max,min,buf; FILE *fp; fp=fopen("Plik2.dat","rb"); fread(&buf,sizeof(double),1,fp); max=min=buf; Język ANSI C – pliki Przykład. Program wyszukujący w pliku wartość minimalną i maksymalną.(cz.2) while( fread(&buf,sizeof(double),1,fp)) { if (buf>max) max=buf; if (buf<min) min=buf; } printf("\n Wartosc maksymalna=%5.2f",max); printf("\n Wartosc minimalna= %5.2f",min); getch(); fclose(fp); return 0; } Język ANSI C-pliki Przykład. Program zamieniający miejscami w pliku element drugi z piątym (cz.1) #include <stdio.h> #include <conio.h> int main(){ int i, buf1,buf2, buf,iloscElementowTypuInt; FILE *fp; fp=fopen("Plik2.dat","r+b"); fseek(fp,0,SEEK_END); iloscElementowTypuInt= ftell(fp)/sizeof(int); if (iloscElementowTypuInt<5) { printf("\n Nie ma wystarczajacej liczby elementow"); getch(); fclose(fp); exit(1); } Język ANSI C- pliki Przykład. Program zamieniający miejscami w pliku element drugi z piątym (cz.2) fseek (fp,1*sizeof(int),SEEK_SET); fread(&buf1,sizeof(int), 1,fp); fseek (fp,4*sizeof(int),SEEK_SET); fread(&buf2,sizeof(int), 1,fp); fseek (fp,1*sizeof(int),SEEK_SET); fwrite(&buf2,sizeof(int), 1,fp); fseek (fp,4*sizeof(int),SEEK_SET); fwrite(&buf1,sizeof(int), 1,fp); fseek(fp,0,0); for (i=0;i< iloscElementowTypuInt;i++){ fread(&buf,sizeof(int),1,fp); printf("\n Element pliku nr %d =%d",i,buf); } fclose(fp); getch();} Język ANSI C-pliki Przykład. Program dopisujący do pliku zadaną liczbę elementów typu int. #include <stdio.h> #include <conio.h> int main(){ int i, buf1,buf2, buf,n=3; FILE *fp; fp=fopen("Plik2.dat","a+b");// tryb dopisywania for (i=0;i<n;i++) { printf("\n Podaj liczbe:"); scanf("%d",&buf); fwrite(&buf,sizeof(int),1,fp); } fseek(fp,0,0); while(fread(&buf,sizeof(int),1,fp)) printf("\n Element pliku nr %d =%d",i,buf); getch(); return 0; } Język ANSI C-pliki Przykład. Program przepisujący zawartość pliku. #include <stdio.h> #include <conio.h> int main(){ int i=0, buf,n=3; FILE *fp1,*fp2; fp1=fopen("Plik2.dat","rb"); fp2=fopen("Plik3.dat","w+b"); while(fread(&buf,sizeof(char),1,fp1)) fwrite(&buf,sizeof(char),1,fp2); fseek(fp2,0,SEEK_SET); while(fread(&buf,sizeof(int),1,fp2)) printf("\n Element pliku nr %d =%d",i++,buf); fclose(fp1); fclose(fp2); getch();return 0;} Język ANSI C – pliki Przykład. Sortowanie zawartość plikuF(niemalejąco). (cz.1) #include <stdio.h> #include <conio.h> int main(){ int tab[5]={ 1,-100,2,3,510}; int i, buf,n=5,zam,p1,p2; FILE *fp; fp=fopen("Plik2.dat","w+b"); for(i=0;i<5;i++) fwrite(&tab[i],sizeof(int),1,fp); fseek(fp,0,SEEK_SET); printf("\n Plik przed sortowaniem"); while(fread(&buf,sizeof(int),1,fp)) printf("\n Element nr %d=%d",i++,buf); Język ANSI C-pliki Przykład. Sortowanie zawartość pliku (niemalejąco). (cz.2) do { zam=0; for( i=0;i<n-1;i++) { fseek(fp,i*sizeof(int),SEEK_SET); fread(&p1,sizeof(int),1,fp); fread(&p2,sizeof(int),1,fp); if (p1>p2) { fseek(fp,i*sizeof(int),SEEK_SET); fwrite(&p2,sizeof(int),1,fp); fwrite(&p1,sizeof(int),1,fp); zam=1; } } } while(zam==1); Język ANSI C-pliki Przykład. Sortowanie zawartość pliku (niemalejąco). (cz.3) fseek(fp,0,SEEK_SET); i=0; printf("\n Plik posortowany"); while(fread(&buf,sizeof(int),1,fp)) printf("\n Element nr fclose(fp); getch(); return 0; } %d=%d",i++,buf); Język ANSI C-pliki Funkcja fprintf int fprintf(FILE *stream, const char *format,...); Funkcja fprintf wypisuje do strumienia wskazywanego przez parametr stream wartości argumentów wymienionych na liście argumentów zgodnie z parametrem format.Zwracana wartość jest równa ilości wypisanych znaków, jeśli wystąpi bład zwracana jest wartość ujemna. Przykład. FILE *fp; fprintf(fp,"Test fprintf % d % f", 2, 24.2); Język ANSI C – pliki P Funkcja fscanf int fscanf(FILE *stream, const char *format,...); Funkcja działa podobnie jak scanf, lecz dane pobiera nie ze strumienia stdin, ale ze strumienia wskazywanego przez parametr stream, zgodnie z parametrem format. Funkcja zwraca liczbę argumentów, którym udało się przypisać wartości. Przykład. FILE *fp; fscanf(fp,"%d%f%lf",&x,&y,&z); Język ANSI C-pliki Przykład. Zapis do pliku dwóch łańcuchów i odczyt. #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { char s1[10]="ABCDE"; char s2[10]="abcde", s3[10], s4[10]; FILE *fp; fp=fopen("Plik1.txt","w+"); Język ANSI C-pliki Przykład. c.d. Odczyt pliku i wydruk. fputs(s1,fp); fputc('\n',fp); fputs(s2,fp); fputc('\n',fp); // dopisanie znaku nowej linii, aby funkcja // fgets czytała tylko pierwszy łańcuch z pliku fseek(fp,0,0); fgets(s3,10,fp); printf("%s",s3); fgets(s4,10,fp); printf("%s",s4); getch(); fclose(fp); return 0; }