Narzędzia użytkownika

Narzędzia witryny


Pasek boczny


O mnie


Dydaktyka:

Feedback


so:prog_files

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 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

POSIX:

fcntl.h (file control) open, creat
unistd.h pozostałe funkcje interfejsu POSIX z tabeli wyżej

C:

errno.h stała errno 1)
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 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:

  • 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:

  1. otworzy ten plik do zapisu i odczytu
  2. ustawi pozycję na początek
  3. przeczytaj 16 bajtów i wypisze na ekran,
  4. odczyta i wypisze na ekran pozycję w pliku,
  5. wpisz do pliku stały ciąg znaków,
  6. 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.

1) Nieliczne wartości stałej errno wchodzą w standard C, większość wartości ustandaryzowanych w POSIX wchodzi też w standard języka C++.
so/prog_files.txt · ostatnio zmienione: 2024/05/15 21:31 przez jkonczak