Wyklad_PI_10.pdf

(825 KB) Pobierz
Programowanie w języku C
Kurs początkowy
Dr inż. Lucjan Miękina
upel.agh.edu.pl/wimir/login/
Katedra Robotyki i Mechatroniki
December 10, 2012
1/1
Programowanie w języku C
Pamięciowe operacje wejścia/wyjścia - zapis do pamięci za pomocą funkcji
sprintf
Funkcja
sprintf
jest identyczna jak
printf,
z wyjątkiem dodatkowego pierwszego
parametru, który jest wskaźnikiem do bloku pamięci. Łańcuch formatujący jest drugim
parametrem. Funkcja jest zadeklarowana jako:
int
sprintf(char* buf,
char*
format, ...);
Wielokropek (...) oznacza, że za łańcuchem formatującym może wystąpić dowolna
ilość dodatkowych argumentów, których wartości są wyprowadzane.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
int
MemOut(char*
buffer) {
if(buffer)
{
float
tab[]
=
{
1.1, 2.2, 3.3};
int
i, cnt
=
0,
len
=
sizeof(tab)/ sizeof(tab[0]);
printf("MemOut(): len=%2d\n", len);
cnt
+=
sprintf(buffer, "len=%2d\n", len);
for(i
=
0;
i
<
len; i++) {
int
pop
=
cnt;
cnt
+=
sprintf(buffer
+
cnt,
"tab[%1d]=%8.1e\n", i, tab[i]);
printf("Zapis %d zn.: %s\n", cnt, buffer
+
pop);
}
printf("BUFOR:\n%s", buffer);
return
0;
}
return
-1;
}
Rezultat wykonania MemOut():
MemOut(): len= 3
Zapis 23 zn.: tab[0]= 1.1e+00
Zapis 39 zn.: tab[1]= 2.2e+00
Zapis 55 zn.: tab[2]= 3.3e+00
BUFOR:
len= 3
tab[0]= 1.1e+00
tab[1]= 2.2e+00
tab[2]= 3.3e+00
2/1
Programowanie w języku C
Pamięciowe operacje wejścia/wyjścia - odczyt z pamięci za pomocą funkcji
sscanf
Funkcja
sscanf
jest identyczna jak
scanf,
z wyjątkiem dodatkowego pierwszego
parametru, który jest wskaźnikiem do bloku pamięci z którego czytane są dane.
Łańcuch formatujący jest drugim parametrem. Funkcja jest zadeklarowana jako:
int
sscanf(char* buf,
char*
format, ...);
Wielokropek (...) oznacza, że za łańcuchem formatującym może wystąpić dowolna
ilość dodatkowych argumentów, będących adresami zmiennych do których są
wprowadzane kolejne wartości.
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int
MemIn(char*
buffer) {
if(buffer)
{
printf("BUFOR w MemIn():\n%s", buffer);
int
len, i, j, cnt
=
0;
cnt
+=
sscanf(buffer, "len=%d\n",
&len);
printf("Czytanie %d elem:\n", len);
float
tab[len];
for(i
=
0;
i
<
len; i++) {
buffer
=
strchr(buffer,
’\n’);
buffer++;
cnt
+=
sscanf(buffer, "tab[%d]=%e\n",
&j, &tab[i]);
printf("tab[%d]= %8.1e\n", j, tab[j]);
}
return
0;
}
return
-1;
}
Rezultat wykonania
MemIn():
BUFOR w MemIn():
len= 3
tab[0]= 1.1e+00
tab[1]= 2.2e+00
tab[2]= 3.3e+00
Czytanie 3 elem:
tab[0]= 1.1e+00
tab[1]= 2.2e+00
tab[2]= 3.3e+00
3/1
Programowanie w języku C
Plikowe operacje wejścia/wyjścia - obsługa plików binarnych
Operacje realizowane w
trybie binarnym
polegają na kopiowaniu wybranych obszarów
pamięci operacyjnej do pliku, lub odczycie z pliku zadanej liczby bajtów i przesłaniu ich
do pamięci operacyjnej. Odbywa się to bez jakiejkolwiek konwersji (przekształcenia), a
więc jest maksymalnie szybkie i dokładne, a także maksymalnie oszczędne jeśli chodzi
o rozmiar pliku. Otrzymuje się jednak postać zapisu nieczytelną dla operatora.
Aby zapewnić współpracę z plikami binarnymi należy:
otworzyć je w trybie binarnym; do odczytu (używając trybu "rb") lub do zapisu
(używając trybu "wb")
do odczytu danych wykorzystać funkcję:
size_t
fread(void* b,
size_t
s,
size_t
c,
FILE*
fp);
do zapisu danych użyć funkcji:
size_t
fwrite(const
void*
b,
size_t
s,
size_t
c,
FILE*
fp);
Funkcje
fread
i
fwrite
zwracają rezultat typu
size_t,
o wartości równej ilości poprawnie
przesłanych danych (w przypadku pełnego sukcesu równy wartości parametru
c).
4/1
Programowanie w języku C
Plikowe operacje wejścia/wyjścia - obsługa plików binarnych: zapis
Poniżej podano fragmenty kodu realizujące operacje zapisu i odczytu danych z
przykładu dotyczącego funkcji
fscanf
i
fprintf,
ale
w trybie binarnym.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int
BinOut(char*
fname) {
FILE*
fp
=
fopen(fname, "wb");
if
(fp) {
float
tab[]
=
{
1.1, 2.2, 3.3
};
int
i, len
=
sizeof(tab)
/
sizeof(tab[0]);
fwrite(&len,
sizeof(int),
1,
fp);
for
(i
=
0;
i
<
len; i++)
// L1
fwrite(&tab[i],
sizeof(float),
1,
fp);
// L2
fclose(fp);
return
0;
}
else
{
perror("fopen");
return
-1;
}
}
Zamiast linii L1 i L2 można użyć bardziej zwartego zapisu:
fwrite(tab,
sizeof(float),
len, fp);
co spowoduje zapis bloku danych o adresie początku tablicy
tab
i o rozmiarze
podanym w
len.
5/1
Zgłoś jeśli naruszono regulamin