wejŚcie/wyjŚcie, cd. 1. formatowane przekształcenia w pamięci

11
YJŚCIE, cd. owane przekształcenia w pamięci. rintf i scanf kierują na standardowe we/wy. Istniej iedniki kierujące wyjście na „wyjście wirtualne” o z „wejścia wirtualnego”. Wirtualne - tzn. w pamię w postaci odpowiedniego łańcucha znaków. Zatem iałań mogą być zapamiętywane w odpowiednich (tablicach) a następnie na końcu „hurtem” kierowan ran. ikiem funkcji printf jest sprintf, zaś funkcji scan bie te funkcje maja postać: scanf(lancuch,``control’’, agr1,arg2,...) anie jest nastepujące: argumenty arg1,agr2,.. są pr nie z opisem zawartym w argumencie kontrolnym contr ane do lancuch. Przy czytaniu pobieramy wartość lan łcamy ją zgodnie z „control” i „rozdzielamy” po ch

Upload: natalie-romero

Post on 31-Dec-2015

18 views

Category:

Documents


2 download

DESCRIPTION

WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci. Funkcje printf i scanf kierują na standardowe we/wy. Istnieją ich odpowiedniki kierujące wyjście na „wyjście wirtualne” oraz czytające z „wejścia wirtualnego”. Wirtualne - tzn. w pamięci - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

WEJŚCIE/WYJŚCIE, cd.

1. Formatowane przekształcenia w pamięci.Funkcje printf i scanf kierują na standardowe we/wy. Istniejąich odpowiedniki kierujące wyjście na „wyjście wirtualne” orazczytające z „wejścia wirtualnego”. Wirtualne - tzn. w pamięcikomputera w postaci odpowiedniego łańcucha znaków. Zatemwyniki działań mogą być zapamiętywane w odpowiednich zmiennych (tablicach) a następnie na końcu „hurtem” kierowanenp. na ekran.Odpowiednikiem funkcji printf jest sprintf, zaś funkcji scanf -sscanf. Obie te funkcje maja postać:sprintf/sscanf(lancuch,``control’’, agr1,arg2,...)Ich działanie jest nastepujące: argumenty arg1,agr2,.. są przekształ-cane zgodnie z opisem zawartym w argumencie kontrolnym controli zapisywane do lancuch. Przy czytaniu pobieramy wartość lancuchprzekształcamy ją zgodnie z „control” i „rozdzielamy” po argumentach

Page 2: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

Zadanie 18Wybierz dowolny program z programów napisanych poprzednioi zmodyfikuj go tak aby zastosować funkcje sprintf lub/i sscanf

Page 3: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

PLIKI - we/wy sekwencyjne

Instrukcja otwarcia pliku ma postać

cid=fopen(nazwa,atrybuty)

gdzie nazwa jest WSKAŹNIKIEM do nazwy pliku (deklarowanym jako np. char *nazwa, zmienna cid jest WSKAŻNIKIEM do „zmiennej plikowej” (ang. channel identifier), deklarowanym jako

FILE *cid;

atrybuty - to “r” - plik to czytania; “w”- zapis (nadpisywanie!), “a” -zapis, ale dołączanie do istniejącego pliku.

Dokładniej w systemie operacyjnym Unix/Linux cid jest wskaźnikiem do STRUKTURY predefiniowanego typu FILE.

Funkcje związane z operacjami na plikach: getc, putc, fscanf, fprintf, (analogi getchar,potchar,scanf,printf) oraz fclose

Przykład użycia funkcji plikowych

Page 4: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

program oblicza kwadraty kolejnych liczb

main()

{

FILE *cid;

int n;

cid=fopen(“kwadraty.dat”, “w”);

for(n=1;n<=100;n++);

fprintf(cid, “%d %d\n”, n,n*n);

flose(cid);

}

gdybyśmy chcieli zadeklarować nazwę pliku (w celu np. czytania jej funkcją scanf, to deklaracja by była : char *nazwa; .... scanf(“%s”,nazwa);

Deklaracja fopen wygląda FILE *fopen();

main(){FILE *cid;int n,v,vsq;cid=fopen(„kwadraty.dat”,”r”);for(n=1;n<=100;n++) {ffscanf(cid, “%d %d”,&v,&vsq);printf(“%d %d”,v,vsq);}fclose(cid);}

Page 5: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

Funkcja fclose(cid) - zamknięcie pliku. W momencie otwarcia z jednym cid może być związana tylko jedna nazwa pliku; po zamknięciu pliku „channel identifier” może być „powtórnie użyty”

(w FORTRANIE zamiast zmiennej cid stosujemy numery „kanałów”)

Funkcje getc(cid) i putc(cid,nazwa_zmiennej_typu_char_lub_int) wyprowadzają i wprowadzają znak z/do pliku. Np. program „przepisujący” jeden znak z pliku1 do pliku2 ma postać:

Page 6: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

main()

{

FILE *cid1,cid2;

int n;

cid1=fopen(“plik1”, “r”);

cid2=fopen(“plik2”, “w”);

n=getc(cid1);

putc(n,cid2);

flose(cid1);

fclose(cid2);

}

Slowa stdin i stdout definiująstandardowe wejście i wyjście.

Stosowane poprzednio funkcjeputchar() i getchar()to w istocie definicje:

#define getchar() getc(stdin)#define putchar(c) putc(c,stdout)

Page 7: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

Przykład programu kopiującego plik1 na plik2

main(){ FILE *cid_in,cid_out;char c,wejscie[20],wyjscie[20];printf(“podaj plik wejsciowy\m”);scanf(“%s”,wejscie);printf(“podaj plik wyjsciowy\m”);scanf(“%s”,wyjscie);cid_in=fopen(wejscie,”r”);cid_out=fopen(wyjscie,”w”);while((c=getc(cid_in))!=EOF)putc(c,cid_out);fclose(cid_in);fclose(cid_out);}

nazwy max 20 znaków, a jakzrobić, aby dowolne? wskazówka:wwskaźniki!

A co zrobić, aby dopisywało doistniejącego pliku?

Page 8: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

Zadanie 19napisz program, któren przepisuje z istniejącego pliku 1 linię doplik1, 2 - do plik2, 3- plik3, 4- plik4, 5-plik5, 6-plik1, 7-plik2, 8-plik3,itd. Przepisywanie z pliku do pliku ma być funkcją

Page 9: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

stderr - standardowe wyjście komunikatu o błedach. Dane wysyłane na stderr pojawią się na końcówce (terminalu)uzytkownika nawet wtedy, gdy standardowe wyjście będzie skierowane gdzie indziej. Dla przykładufprintf(stderr,” BŁĄD, nie mode otworzyć pliku!\n”);wyśle komunikat na ekran, nawet gdy stdout skierowane zostałona np. na drukarkęFunkcja exit i _exit (#include <stdlib.h>) Funkcja exit(int status) powoduje zakończenie działaniaprogramu. Wszystkie dane z buforów przenioesione do plików,pliki zamknięte, działanie programu zakończone. Warstośćzmiennej status informuje o sukcesie (status=0) lub „problemach”(status<>0) z zakończeniem. UWAGA: wartość status zależnaod implementacji programu, czasem to nie int ale łańcuch„EXIT_SUCCESS” LUB „EXIT_FAILURE”. Funkcja_exit() - natychmiastowe zakonczenie, bez zamykania, kopiowaniabuforów, etc. Obie funkcje są w <stdlib.h>

Page 10: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

Inną funkcją ze <stdlib.h> jest system, system(const char *s)funkcja wywołuje komendę systemową, np.system(“moj.bat”); wywołuje wykonanie skryptu/programuużytkownika z pliku mój.bat (oczywiście plik ten musi znajdowaćsię w tym samym katalogu, co program - albo trzeba podacnp.: ~/student/home/Documents/mój.bat)

Omówiony poprzednioprogram przepisywał jeden plik na drugi. Ale przytrafić się może, żenp.. plik, który chcemy czytać nie istnieje. Program powinien„przewidzieć” taką możliwość. Podany niżej przykład ilustrujew jaki sposób ustrzec się błędów tego typu

Page 11: WEJŚCIE/WYJŚCIE, cd. 1. Formatowane przekształcenia w pamięci

main(){ FILE *cid_in,cid_out;char c,wejscie[20],wyjscie[20];printf(“podaj plik wejsciowy\m”);scanf(“%s”,wejscie);printf(“podaj plik wyjsciowy\m”);scanf(“%s”,wyjscie);if((cid_in=fopen(wejscie,”r”))==0){ printf(“ nie ma pliku %s\n”,wejscie) exit(0)};if((cid_out=fopen(wyjscie,”w”))==0){ printf(“ nie mogę otworzyc %s\n”,wyjscie) exit(0)};while((c=getc(cid_in))!=EOF){if((putc(c,cid_out)==EOF){printf(“nie mogę zapisać, disk error\n”);exit(0)};fclose(cid_in);fclose(cid_out);}