[C++] Nieformatowane operacje na plikach


(Quentin) #1

Witam!

Mam kilka pytań odnośnie nieformatowanych operacji wejścia/wyjścia na plikach.

1-sza sprawa:

Przykładowo mamy taki programik:

ofstream strumien;strumien.open("plik_testowy.txt", ios::out);

(Sawyer47) #2

Ogólnie operacje nieformatowane działają na surowych bajtach. Jeśli czytasz/wypisujesz coś np. typu double - nie operujesz na zapisie tekstowym ten liczby tak jak robią to operacje formatowane (np. "3.14"), a na reprezentacji bitowej.

Akurat tak dobrałeś dane w drugim przykładzie, że "3.14" zajmuje 4 bajty (4*sizeof(char)), natomiast wypisując za pomocą metody write piszesz do pliku reprezentację bitową liczby, a więc zajmie to w twoim przypadku sizeof(double) bajtów. Gdybyś chciał zapisać PI z większą dokładnością, 3.1415926535 - wtedy operując na znakach masz 12*sizeof(char) bajtów, a operując wartością double masz wciąż 8 bajtów.

Wybór należy do programisty, są wady i zalety. Ogólnie operacje na reprezentacji bitowej są szybsze.

Z drugiej strony zapis "3.1415926535" jest możliwy do odczytania dla człowiek, użytkownik mógłby np. zmienić tę wartość w pliku tekstowym. Natomiast zapisując bitową reprezentację double oszczędzasz miejsce (i czas, bo zapis jest szybszy), ale jeśli chcesz zmienić tę wartość w pliku musisz ponownie wczytać te bajty do pamięci jako typ double, bo w pliku będą dane nieczytelne dla człowieka.


(Quentin) #3

Aha, już rozumiem. Formatowane operacje robią takie triki, że liczba staje się tekstem.

A jeszcze jedno. Jeżeli zapiszemy coś do pliku binarnie i odczytamy to operacją formatowaną - bity zostaną potraktowane jako tekst :?:

double liczba = 3.14;strumien.write( (char*)liczba, sizeof(liczba) );

(Sawyer47) #4

To zależy, m.in. od interpretacji pytania :wink: Zapis (symbolicznie:) out.write(double), a potem odczyt z tego samego źródła in >> double nie ma większego sensu, bo nie odzyskasz pierwotnej wartości. Mieszanie tych typów wejścia/wyjścia zazwyczaj nie ma sensu, przynajmniej jeśli chce się otrzymać te same dane. Jednak jeśli sobie wymyślisz przypadek w którym pomieszanie jest przydatne to czemu nie, to zależy od programisty.


(Quentin) #5

No, czyli ta zasada się sprawdza :slight_smile:

Jeżeli wybraliśmy operację nieformatowaną, to zawsze musimy już pracować na tym pliku funkcjami nieformatowanymi, jeżeli chcemy zobaczyć sensowne efekty. I na odwrót.


(Sawyer47) #6

Nie jest to przymus, ale ma sens. Poprawię się jeszcze:

Mieszanie tych typów wejścia/wyjścia zazwyczaj nie ma sensu, przynajmniej jeśli chce się otrzymać te same dane w tej samej postaci.

Teraz jest ściślej :wink: