Tuesday 28 November 2017

Wifstream opcje binarne


Czytam plik binarny jako: Ale zdaję sobie sprawę, że nie jest to prawdziwy odczyt binarny. Ifstream faktycznie czyta bajt i konwertuje go na szeroki znak. Więc jeśli plik binarny ma zawartość 0x112233. ff. W rzeczywistości czytałem 0x110022003300. ff00. Nie ma to dla mnie większego sensu: po pierwsze, potrzebuję tylko szerokiego strumienia, ponieważ nazwa pliku nie jest łacińska. Po drugie, jeśli powiem, że fstream jest binarny, dlaczego czyta czytać szerokie znaki Poniższy kod robi to, co chcę. Czy istnieje sposób, aby osiągnąć to za pomocą std fstreams zapytał Mar 21 11 o 19:15 I39m przy użyciu Visual Studio dla Windows i kompilatora intel dla Linuksa. Twoje rozwiązanie działało poprawnie w systemie Windows. Nie testowałem jeszcze tego na Linuksie. To dość eleganckie rozwiązanie. I39d woli jednak nie polegać na rozszerzeniach kompilatora. Czy myślisz, że możesz zrobić to przylegając do standardu, może określając zestaw znaków jako szablonowy parametr do ifstream ndash rturrado Mar 22 11 o 15:15 rturrado: (usunięto mój poprzedni komentarz) Nie polecam już Boost. Filesystem od jego podejście polega na definiowaniu różnych interfejsów na różnych platformach, co zasadniczo powoduje problemy z przenośnością i sprawia, że ​​trudniej jest napisać prawidłowy kod Unicode. Z mojego doświadczenia wynika, że ​​lepiej postępować zgodnie z podejściem, które napisałem w EDYCJI. ndash ybungalobill Aug 23 12 at 13: 00C Plik binarny IO Zwykle dla pliku binarnego io nie używasz konwencjonalnego tekstu i operatorów tekstowych Można to zrobić, ale jest to zaawansowany temat. Podstawowy model dla pliku IO W C, klasy strumieni plików zostały zaprojektowane z myślą, że plik powinien być po prostu wyświetlany jako strumień lub tablica niezinterpretowanych bajtów. Dla wygody tablica bajtów przechowywanych w pliku jest indeksowana od zera do len -1, gdzie len jest całkowitą liczbą bajtów w całym pliku. Każdy otwarty plik ma dwie pozycje z nim związane: Aktualna pozycja czytania, która jest indeksem następnego bajtu, który zostanie odczytany z pliku. Nazywa się to wskaźnikiem "get", ponieważ wskazuje on na następną postać, którą zwróci podstawowa metoda get. Aktualna pozycja zapisu, która jest indeksem lokalizacji bajtów, gdzie zostanie umieszczony następny bajt wyjściowy. Nazywa się to wskaźnikiem put, ponieważ wskazuje na lokalizację, w której metoda "podstawiania" umieści jego parametr. Te dwie pozycje plików są niezależne i albo można wskazać w dowolnym miejscu w pliku. Określenie rozmiaru pliku Typowym sposobem uzyskania rozmiaru pliku jest użycie statystyki funkcji biblioteki C. Zauważ, że drugim parametrem statystyki jest wskaźnik. Twoim obowiązkiem jest tworzenie i zarządzanie pamięcią, w której statka będzie umieszczać wyniki, a adres tej pamięci jest tym, co powinieneś przekazać jako drugi parametr. Powyższy przykład pokazuje użycie zmiennej lokalnej do przechowywania wyników zwróconych przez stat. Otwieranie pliku Obiekt strumienia plików można otworzyć na jeden z dwóch sposobów. Po pierwsze, możesz podać nazwę pliku wraz z parametrem trybu io do konstruktora podczas deklarowania obiektu: Alternatywnie, po zadeklarowaniu obiektu strumienia plików, możesz wywołać jego metodę otwartą: Każde podejście będzie działać z ifstream. an ofstream. lub obiekt fstream. Zwykle podczas manipulowania plikami tekstowymi pomija się drugi parametr (parametr trybu io). Jednakże, aby manipulować plikami binarnymi, zawsze powinieneś określać tryb io, w tym ios :: binary jako jedną z flag trybu. Aby odczytać dostęp do pliku, użyj strumienia fstream. Uwaga: Jeśli jesteś użytkownikiem GNU g (wersja 2.7.x lub wcześniejsza), nie używaj flag trybu io przy otwieraniu obiektów typu "ifstream". Z powodu błędu w implementacji GNU libg flagi nie będą poprawnie interpretowane. Jeśli pracujesz pod Unixem, całkowicie pomiń flagi trybu io, jeśli pracujesz z g w MS-DOS, użyj obiektu fstream. Ta uwaga dotyczy tylko g użytkowników. Czytanie z pliku Aby odczytać z obiektu fstream lub ifstream, użyj metody read. Ta metoda pobiera dwa parametry: Funkcja odczytu fragmentów wyodrębnia określoną liczbę bajtów z danego strumienia, umieszczając je w pamięci wskazywanej przez pierwszy parametr. Twoim obowiązkiem jest tworzenie i zarządzanie pamięcią, w której odczyt będzie zawierał wynik, a także zapewnienie, że jest wystarczająco duża, aby pomieścić żądaną liczbę bajtów. Bajty, które są odczytywane i nieinterpretowane, metoda nie przyjmuje niczego na temat zakończenia linii, a metoda read nie umieszcza terminatora o wartości zerowej na końcu bajtów, które są odczytywane. Jeśli wystąpi błąd podczas odczytu (na przykład jeśli czytasz koniec pliku), strumień jest umieszczany w stanie błędu. Jeśli tak się stanie, możesz użyć metody gcount, aby dowiedzieć się, ile znaków zostało przeczytanych, i użyć metody clear, aby zresetować strumień do stanu używalności. Gdy strumień przejdzie w stan błędu, wszystkie przyszłe operacje odczytu zakończą się niepowodzeniem. Ponowne pozycjonowanie wskaźnika Get Aby zmienić położenie wskaźnika get (pozycja odczytu pliku) obiektu fstream lub ifstream, należy użyć metody seekg. Podstawowa forma tej operacji przyjmuje jeden parametr: Streampos jest w zasadzie długością całkowitą bez znaku. seekg przesuwa wskaźnik get do określonej bezwzględnej pozycji pliku (gdzie 0 jest początkiem pliku). Podczas wywoływania seekg należy uważać na typy argumentów: Powyższy problem polega na tym, że pliki mogą być stosunkowo duże, więc strumienie mogą zawierać bardzo duże liczby. Ale powyżej, jeśli blk numer jest powyżej 63. ze względu na typy blknumber i BLKSIZE (oba int s), na PC ich produkt może mieć tylko 16 bitów szerokości. Aby to skorygować, upewnij się, że stałe używane w pozycjonowaniu pliku są długimi wartościami lub, że wszystkie zmienne używane w takim pozycjonowaniu są długimi lub obu. Możesz określić aktualną pozycję wskaźnika get za pomocą myFile. tellg (), metody bez parametrów, która zwraca indeks wskaźnika get na danym strumieniu. Istnieje również wariant seekg, który pozwala określić położenie względem aktualnej lokalizacji wskaźnika położenia lub względem końca pliku. Zapisywanie do pliku Aby napisać do obiektu fstream lub ofstream, użyj metody write. Ta metoda przyjmuje dwa parametry: Funkcja zapisu zapisuje określoną liczbę bajtów w danym strumieniu, zaczynając od pozycji wstawionego wskaźnika. Jeśli wskaźnik put jest aktualny na końcu pliku, plik jest rozszerzany. Jeśli wskaźnik put wskazuje na środek pliku, znaki w pliku zostaną zastąpione nowymi danymi. Bajty, które są zapisane i nie są interpretowane, po danych nie są dodawane znaki powrotu karetki, a metoda zapisu nie zakłada, że ​​na końcu zapisywanych bajtów znajduje się terminator o wartości NULL. Jeśli podczas zapisu wystąpi błąd (na przykład, jeśli zabraknie miejsca na dysku), strumień zostanie umieszczony w stanie błędu. Takie błędy nie są tak powszechne, jak błędy odczytu i często nie są sprawdzane. Zmiana położenia wskaźnika Put Aby zmienić położenie wskaźnika put (pozycja odczytu pliku) obiektu fstream lub ofstream, użyj metody seekp. Podstawowa forma tej operacji przyjmuje jeden parametr: Streampos jest w zasadzie długością całkowitą bez znaku. seekp przenosi wskazany wskaźnik do określonej bezwzględnej pozycji pliku (gdzie 0 jest początkiem pliku). Możesz określić aktualną pozycję wskaźnika put przy użyciu myFile. tellp (), metody bez parametrów, która zwraca indeks wskaźnika put na danym strumieniu. Istnieje również wariant seekp, który pozwala określić pozycję względem aktualnej lokalizacji wskaźnika put lub względem końca pliku. Odczytywanie i zapisywanie danych zespolonych Chociaż metody odczytu i zapisu akceptują wskaźnik znaku, nie ma wymogu, aby dane, które odczytałeś i zapisały, były przechowywane w tablicy znaków. Możesz czytać lub pisać złożone obiekty danych za pomocą prostego rzutowania wskaźników: Zamykanie pliku Dla wszystkich obiektów strumienia plików użyj: std. ifstream. open Otwiera plik identyfikowany przez argument filename. powiązanie go z obiektem strumienia, aby operacje inputoutput były wykonywane na jego zawartości. Tryb argumentu określa tryb otwierania. Jeśli strumień jest już powiązany z plikiem (tzn. Jest już otwarty), wywołanie tej funkcji kończy się niepowodzeniem. Powiązanie pliku strumienia jest utrzymywane przez jego wewnętrzny bufor strumienia: Wewnętrznie, funkcja wywołuje rdbuf () - gtopen (filename, mode) Funkcja ustawia failbit w przypadku awarii. Parametry nazwa pliku Ciąg z nazwą pliku do otwarcia. Informacje o jego formacie i ważności zależą od implementacji biblioteki i środowiska pracy. mode Flagi opisujące żądany tryb io dla pliku. Jest to obiekt typu openmode typu masek bitowych, który składa się z kombinacji następujących stałych składowych:

No comments:

Post a Comment