Dydaktyka:
Feedback
POSIX:
C:
Deskryptory plików:
Wybrane flagi dla funkcji
Pozycje odniesienia dla
Wyciąg funkcji i stałych z materiałów
Porównanie API
POSIX C I/O C++ streams
identyfikuje plik przez:
deskryptor pliku
int
wskaźnik
FILE*
specjalizowane klasy
std::ifstream
/std::ofstream
/std::fstream
otwieranie / tworzenie / zamykanie / usuwanie pliku:
open
creat
fopen
konstruktor klasy lub metoda
open
close
fclose
metoda
close
unlink
remove
std::filesystem::remove
odczyt / zapis / zmiana pozycji:
read
fread
, fscanf
, fgetc
, fgets
, … operator >>, metody
read
, readsome
, get
, getline
, …
write
fwrite
, fprintf
, fputc
, fputs
, … operator <<, metody
write
, put
, …
lseek
fseek
, ftell
, fgetpos
, fsetpos
, … metoda
tellg
i seekg
inne:
truncate
ftruncate
std::filesystem::resize_file
dup
dup2
standardowe identyfikatory wejścia/wyjścia/błędu:
0
, 1
i 2
stdin
, stdout
i stderr
std::cin
, std::cout
i std::cerr
#include'y
fcntl.h
(file control)
open
, creat
unistd.h
pozostałe funkcje interfejsu POSIX z tabeli wyżej
errno.h
stała
errno
1)
stdio.h
perror
string.h
strerror
Wybrane stałe
Wartość Nazwa stałej
0 STDIN_FILENO
1 STDOUT_FILENO
2 STDERR_FILENO
open
:
O_RDONLY
, O_RDWR
, O_WRONLY
O_CREAT
lub O_CREAT | O_EXCL
(przy ustawieniu tej flagi do funkcji open
trzeba przekazać trzeci argument opisujący uprawnienia nowo tworzonego pliku)O_APPEND
O_TRUNC
lseek
:
Zadanie 1 Napisz "hello world" dodając jedną linię do poniższego kodu. Użyj funckji z interfejsu POSIX.
#include <unistd.h> int main(){ return 0; }
Zadanie 2
Napisz program który zapyta o imię, następnie wypisze Witaj <imię>
.
Do odczytu ze standardowego wejścia użyj funkcji z interfejsu POSIX.
Zadanie 3 Napisz program który dwa razy wykona kolejno:
"no"
,"to"
,"wać\n"
.Następnie sprawdź działanie kodu w następujące sposoby:
./prog
),cat
(tzn. ./prog | cat
),stdbuf -o0 bash
, potem uruchom program normalnie.Wyjaśnij różnice w wynikach.
Zadanie 4 Napisz program który wyświetli na ekranie całą zawartość pliku podanego jako pierwszy argument.
Zadanie 5
Napisz program który spróbuje otworzyć plik którego nazwa została podana jako
pierwszy argument i wyświetli komunikat czy otwarcie (do zapisu i odczytu) się
powiodło. Jeśli otwarcie się nie powiodło, program ma wyświetlać odpowiedni
komunikat. Dodatkowo wybierz i obsłuż trzy z poniższych punktów.
Jeśli otwarcie się nie powiodło:
\e[44m
),\e[41m
),\e[42m
),\e[46m
),\e[45m
).Do wypisania komunikatu w konkretnym kolorze, wypisz przed nim podane w nawiasach znaki, a za nim
\e[0m
.
Przykładowym gniazdem które można użyć do testów jest plik /dev/log
.
Zadanie 6 Napisz program który jako argumenty przyjmuje dwie ścieżki do plików i wypisuje na standardowe wyjście czy pliki są identyczne.
Zadanie 7
Napisz program który jako argument przyjmuje ścieżkę do pliku plik
.
Program ma stworzyć pliki o nazwach plik_u
i plik_l
zawierające
treść źródłowego pliku, przy czym w pierwszym wszystkie litery (znaki ASCII
a-z
) mają być zmienione na wielkie, a w drugim na małe.
Nagłówek ctype.h
udostępnia funkcje toupper
i tolower
.
Zadanie 8
Napisz program który dla każdego pliku podanego jako argument wypisze wielkość
pliku i ostatnie 16 bajtów z pliku. Użyj funkcji lseek
.
Zadanie 9 Napisz w dwóch wersjach program który zmienia małe litery na wielkie w pliku podanym jako argument:
Zadanie 10 Umieść w wybranym pliku przynajmniej 32 bajty tekstu. Następnie stwórz program, który:
Sprawdź jak wygląda treść pliku.
open
flagę O_APPEND
i porównaj działanie programu.
Zadanie 11 Napisz program który usunie z pliku wskazanego jako argument wszystko poza pierwszą linią.
Zadanie 12
Napisz program który stworzy plik o stałej nazwie i ustawi jego rozmiar na
4.5036e15
bajtów (czyli ok. 4 petajabty). Następnie program ma wpisać stałe
wybrane ciągi znaków na początek i na koniec pliku.
Uruchom program, następnie podaj rzeczywistą wielkość pliku. Spróbuj wyświetlić
pierwsze 16 bajtów pliku, cały plik (używając np. cat -v
) i ostatnie 16
bajtów pliku.
Zadanie 13
Stwórz program który otworzy plik podany jako pierwszy argument programu, a
następnie wykorzystując dup
bądź dup2
zastąpi standardowe wyjście tym
plikiem. Potem program ma kolejno wykonać przykładowy write
do
STDOUT_FILENO
, printf
oraz ma wykonać jakąś komendę poleceniem
system
(np. system("ls -la")
). Które z tekstów trafiły do pliku po
uruchomieniu programu?
Zadanie 14 Stwórz program który otworzy wskazany w argumentach plik, następnie usunie go i spróbuje odczytać zawartość do końca pliku z deskryptora zwróconego przez funkcję open.
errno
wchodzą w standard C, większość wartości ustandaryzowanych w POSIX wchodzi też w standard języka C++.