przejście do zawartości
Jan Kończak
Narzędzia użytkownika
Zaloguj
Narzędzia witryny
Narzędzia
Pokaż stronę
Poprzednie wersje
Odnośniki
Ostatnie zmiany
Menadżer multimediów
Indeks
Zaloguj
Ostatnie zmiany
Menadżer multimediów
Indeks
Jesteś tutaj:
start
»
so
»
prog_files
so:prog_files
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
~~NOTOC~~ ===== Materiały ===== <html><h3></html> 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**. <html></h3></html> ------------ <small> <html><div style="line-height:1em;"></html> ===== 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: <html><div style="margin-bottom:-1.2em"></div></html> | ''fcntl.h'' | (__f__ile __c__o__nt__ro__l__) | ''open'', ''creat'' | | ''unistd.h'' || pozostałe funkcje interfejsu POSIX z tabeli wyżej | C: <html><div style="margin-bottom:-1.2em"></div></html> | ''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: <html><div style="margin-bottom:-1.2em"></div></html> ^ Wartość ^ Nazwa stałej ^ | **0** | STDIN_FILENO | | **1** | STDOUT_FILENO | | **2** | STDERR_FILENO | Wybrane flagi dla funkcji ''open'': <html><div style="margin-bottom:-1.2em"></div></html> * 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'': <html><div style="margin-bottom:-1.2em"></div></html> * SEEK_SET * SEEK_CUR * SEEK_END <html></div></html> </small> ------------ ===== Zadania ===== ~~Zadanie.#~~ Napisz "hello world" dodając jedną linię do poniższego kodu. Użyj funckji z interfejsu POSIX. <html><div style="margin-bottom:-1.2em"></div><div style="line-height:1.1em;"></html> <code c> #include <unistd.h> int main(){ return 0; } </code> <html></div></html> ~~Zadanie.#~~ 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.#~~ Napisz program który __dwa razy__ wykona kolejno: <html><div style="margin-bottom:-1.2em"></div></html> * 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"''. <html><div style="margin-bottom:-1.2em"></div></html> Następnie sprawdź działanie kodu w następujące sposoby: <html><div style="margin-bottom:-1.2em"></div></html> * 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. <html><div style="margin-bottom:-1.2em"></div></html> 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: <html><div style="margin-bottom:-1.2em"></div></html> * 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''). <html><div style="margin-bottom:-1.2em"></div></html> <small> 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''.</small> ~~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.\\ <small>Nagłówek ''ctype.h'' udostępnia funkcje ''toupper'' i ''tolower''.</small> ------------ ~~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: <html><div style="margin-bottom:-1.2em"></div></html> * 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: <html><div style="margin-bottom:-1.2em"></div></html> - 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. <html><div style="margin-bottom:-1.2em"></div></html> 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 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.
so/prog_files.1715800961.txt.gz
· ostatnio zmienione: 2024/05/15 21:22 przez
jkonczak
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Złóż / rozłóż wszystko
Do góry