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);
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);
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.
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) );
To zależy, m.in. od interpretacji pytania 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.
No, czyli ta zasada się sprawdza
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.
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