errno wchodzą w standard C, większość wartości ustandaryzowanych w POSIX wchodzi też w standard języka C++.Materiały
Materiały do tego tematu znajdują się na kursie moodle do wykładu z przedmiotu:
https://ekursy.put.poznan.pl/mod/resource/view.php?id=2510453.
(Te materiały są dostępne na dole strony kursu do wykładów, w sekcji laboratorium.)
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
creatfopen 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_WRONLYO_CREAT lub O_CREAT | O_EXCL (przy ustawieniu tej flagi do funkcji open trzeba przekazać trzeci argument opisujący uprawnienia nowo tworzonego pliku)O_APPENDO_TRUNClseek:
SEEK_SETSEEK_CURSEEK_END
Zadania
Uwaga: we wszystkich zadaniach do obsługi I/O oraz plików należy używać funkcji z materiałów do zajęć (o ile polecenie wprost nie podaje inaczej).
Zadanie 1 Napisz "hello world" dodając jedną linię do poniższego kodu. Użyj funkcji 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:
- wypisze na standardowe wyjście funkcją z API języka C ciąg znaków
"no", - wypisze na standardowe wyjście funkcją z API POSIX ciąg znaków
"to", - wypisze na standardowe wyjście funkcją z API języka C ciąg znaków
"wać\n".
Następnie sprawdź działanie kodu w następujące sposoby:
- uruchom program normalnie (tzn.
./prog), - wynik programu przepuść w potoku przez program
cat(tzn../prog | cat), - najpierw wpisz w konsoli
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:
- bo plik nie istnieje, komunikat ma być na granatowym tle (
\e[44m), - z powodu braku uprawnień, komunikat ma być na czerwonym tle (
\e[41m), - bo plik jest katalogiem, komunikat ma być na żółtym tle (
\e[42m), - z powodu nieskończonej pętli przekierowań, komunikat ma być na niebieskim tle (
\e[46m), - bo ścieżka wskazuje na gniazdo lub inny plik specjalny, komunikat ma być na fioletowym tle (
\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:
- w pierwszej wersji plik jest otwarty jednokrotnie i po przeczytaniu bloku należy się cofnąć i nadpisać blok,
- w drugiej wersji plik otwierany jest dwa razy, następnie kolejne bloki odczytywane z jednego deskryptora są zapisywane do drugiego.
Zadanie 10 Umieść w wybranym pliku przynajmniej 32 bajty tekstu. Następnie stwórz program, który:
- otworzy ten plik do zapisu i odczytu
- ustawi pozycję na początek
- przeczyta 16 bajtów i wypisze na ekran,
- odczyta i wypisze na ekran pozycję w pliku,
- wpisze do pliku stały ciąg znaków,
- ponownie odczyta i wypisz na ekran pozycję w pliku.
Sprawdź jak wygląda treść pliku.
Następnie zmodyfikuj program dodając do listy flag podawanej funkcji
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.