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;
}