~~NOTOC~~ ===== 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**.

------------
===== Wyciąg funkcji i stałych z materiałów ===== ==== Porównanie API ==== ^ POSIX ^ [[https://en.cppreference.com/w/cpp/io/c|C I/O]] ^ [[https://en.cppreference.com/w/cpp/io|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 ==== POSIX:
| ''fcntl.h'' | (__f__ile __c__o__nt__ro__l__) | ''open'', ''creat'' | | ''unistd.h'' || pozostałe funkcje interfejsu POSIX z tabeli wyżej | C:
| ''errno.h'' | stała ''errno'' ((Nieliczne wartości stałej ''errno'' wchodzą w standard C, większość wartości ustandaryzowanych w POSIX wchodzi też w standard języka C%%++%%.)) | | ''stdio.h'' | ''perror'' | | ''string.h'' | ''strerror'' | ==== Wybrane stałe ==== Deskryptory plików:
^ Wartość ^ Nazwa stałej ^ | **0** | STDIN_FILENO | | **1** | STDOUT_FILENO | | **2** | STDERR_FILENO | Wybrane flagi dla funkcji ''open'':
* obowiązkowo jedna z flag: ''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'' Pozycje odniesienia dla ''lseek'':
* SEEK_SET * SEEK_CUR * SEEK_END
------------ ===== Zadania ===== ~~Zadanie.#~~ Napisz "hello world" dodając jedną linię do poniższego kodu. Użyj funckji z interfejsu POSIX.
#include int main(){ return 0; }
~~Zadanie.#~~ Napisz program który zapyta o imię, następnie wypisze ''Witaj ''. Do odczytu ze standardowego wejścia użyj funkcji z interfejsu POSIX. ~~Zadanie.#~~ 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.#~~ Napisz program który wyświetli na ekranie całą zawartość pliku podanego jako pierwszy argument. ~~Zadanie.#~~ 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.#~~ Napisz program który jako argumenty przyjmuje dwie ścieżki do plików i wypisuje na standardowe wyjście czy pliki są identyczne. ~~Zadanie.#~~ 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.#~~ 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.#~~ 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.#~~ 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 - przeczytaj 16 bajtów i wypisze na ekran, - odczyta i wypisze na ekran pozycję w pliku, - wpisz 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.#~~ Napisz program który usunie z pliku wskazanego jako argument wszystko poza pierwszą linią. ~~Zadanie.#~~ 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.#~~ 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.#~~ 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.