tBane Temat założony przez niniejszego użytkownika |
» 2023-01-06 21:19:44 W obu przypadkach jednak powinien byc char (bez unsigned). Algorytm dziala, dziekuje za pomoc! Gdyby nie Ty, DejaVu - to nie wiem, co bym zrobi. Dzieki za pomoc, pozdrawiam :-) Dobry kod ponizej: char r, g, b, a;
ifstream plik( filename, ios::in | ios::binary ); for(;; ) { plik.read( & r, 1 ); plik.read( & g, 1 ); plik.read( & b, 1 ); plik.read( & a, 1 ); if( !plik.good() ) break; printf( "[ %i,%i,%i,%i ]\n", r, g, b, a ); } plik.close();
|
|
DejaVu |
» 2023-01-06 21:34:48 Taka ciekawostka - mogłeś użyć GPT chat do rozwiązania Twojego problemu: Mam plik binary w którym zapisałem kolory w formacie RGBA. Jak wczytać ten plik w C++?Możesz użyć funkcji fread z pliku nagłówkowego stdio.h do odczytania danych z pliku binarnego do tablicy w pamięci. Przykład: Copy code #include <iostream> #include <cstdio>
using namespace std;
const int N = 100;
struct Color { unsigned char r, g, b, a; };
int main() { Color colors[ N ]; FILE * fp = fopen( "colors.bin", "rb" ); if( !fp ) { cerr << "Błąd podczas otwierania pliku!" << endl; return 1; } size_t read = fread( colors, sizeof( Color ), N, fp ); if( read < N ) { cerr << "Błąd podczas odczytu danych z pliku!" << endl; return 1; } fclose( fp ); for( int i = 0; i < N; i++ ) { cout << "Kolor " << i << ": " <<( int ) colors[ i ].r << ", " <<( int ) colors[ i ].g << ", " <<( int ) colors[ i ].b << ", " <<( int ) colors[ i ].a << endl; } return 0; } Funkcja fread przyjmuje trzy argumenty: wskaźnik do bufora, rozmiar pojedynczego elementu i liczbę elementów do odczytania. W powyższym przykładzie odczytujemy N elementów o rozmiarze sizeof(Color) bajtów do tablicy colors. Jeśli odczyt się powiedzie, fread zwróci liczbę odczytanych elementów. Uwaga: nie należy używać funkcji fread z pliku nagłówkowego fstream ponieważ ta implementacja jest znacznie wolniejsza niż ta z pliku nagłówkowego stdio.h. DejaVu DejaVu Nie chcę definiować rozmiaru tablicy. Kod ma automatycznie wykryć koniec pliku.Możesz użyć funkcji ftell z pliku nagłówkowego stdio.h do uzyskania aktualnej pozycji w pliku oraz funkcji fseek do ustawienia pozycji w pliku na koniec. Następnie możesz użyć ftell ponownie, aby uzyskać rozmiar pliku w bajtach, a następnie zaalokować odpowiednią ilość pamięci i odczytać dane z pliku. Przykład: Copy code #include <iostream> #include <cstdio> #include <cstdlib>
using namespace std;
struct Color { unsigned char r, g, b, a; };
int main() { FILE * fp = fopen( "colors.bin", "rb" ); if( !fp ) { cerr << "Błąd podczas otwierania pliku!" << endl; return 1; } fseek( fp, 0, SEEK_END ); size_t file_size = ftell( fp ); rewind( fp ); Color * colors =( Color * ) malloc( file_size ); if( !colors ) { cerr << "Błąd podczas alokacji pamięci!" << endl; return 1; } size_t read = fread( colors, sizeof( Color ), file_size / sizeof( Color ), fp ); if( read < file_size / sizeof( Color ) ) { cerr << "Błąd podczas odczytu danych z pliku!" << endl; return 1; } fclose( fp ); size_t count = file_size / sizeof( Color ); for( int i = 0; i < count; i++ ) { cout << "Kolor " << i << ": " <<( int ) colors[ i ].r << ", " <<( int ) colors[ i ].g << ", " <<( int ) colors[ i ].b << ", " <<( int ) colors[ i ].a << endl; } free( colors ); return 0; } DejaVu DejaVu Celem jest wczytanie pliku binarnego gdzie kolory są zapisane w formacie RGBA. Rozmiar pliku jest nieznany. Zaimplementuj rozwiązanie. Nie pisz dodatkowych opowieści.Oto implementacja wczytywania pliku binarnego z kolorami zapisanymi w formacie RGBA: Copy code #include <iostream> #include <cstdio> #include <cstdlib> #include <vector>
using namespace std;
struct Color { unsigned char r, g, b, a; };
int main() { FILE * fp = fopen( "colors.bin", "rb" ); if( !fp ) { cerr << "Błąd podczas otwierania pliku!" << endl; return 1; } fseek( fp, 0, SEEK_END ); size_t file_size = ftell( fp ); rewind( fp ); vector < Color > colors; while( !feof( fp ) ) { Color color; if( fread( & color, sizeof( Color ), 1, fp ) != 1 ) { break; } colors.push_back( color ); } fclose( fp ); for( size_t i = 0; i < colors.size(); i++ ) { cout << "Kolor " << i << ": " <<( int ) colors[ i ].r << ", " <<( int ) colors[ i ].g << ", " <<( int ) colors[ i ].b << ", " <<( int ) colors[ i ].a << endl; } return 0; } W powyższym kodzie używamy funkcji fread do odczytywania pojedynczych elementów z pliku do zmiennej color. Następnie dodajemy ten kolor do wektora colors. Pętla jest kontynuowana dopóki nie nastąpi koniec pliku lub odczyt nie zakończy się niepowodzeniem. |
|
1 « 2 » |