Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

fstream binary rozmiar pliku

Ostatnio zmodyfikowano 2015-02-08 22:34
Autor Wiadomość
__NAME__
Temat założony przez niniejszego użytkownika
fstream binary rozmiar pliku
» 2015-02-08 14:01:35
Witam,

Chcę odczytać z pliku najpierw 3 floaty, potem size_t, a następnie size_t rozmiar oraz tyle size_t ile wynosi rozmiar.
Problem polega na tym, że nie wiem ile charów (bajtów) zarezerwować oraz jak właściwie te chary zrzutować na potrzebne mi typy danych.
P-126185
krecik1334
» 2015-02-08 14:40:07
użyj jakiejś dynamicznej tablicy wtedy rozwiążesz problem z liczbą charów
P-126187
pekfos
» 2015-02-08 14:55:01
Problem polega na tym, że nie wiem ile charów (bajtów) zarezerwować
Rozmiar masz zdaje się odczytać z pliku, a 'nagłówek' pliku ma stały rozmiar. Rezerwowanie pamięci na cały plik nie ma żadnego sensu.

jak właściwie te chary zrzutować na potrzebne mi typy danych.
Odczytuj od razu do zmiennych właściwych typów.
P-126188
__NAME__
Temat założony przez niniejszego użytkownika
» 2015-02-08 21:22:56
Mam taki konstruktor:

C/C++
Point::Point( string s )
{
    dimensions.clear();
    path = s;
   
    fstream f;
   
    f.open( path.c_str(), ios::in | ios::binary );
   
    if( !f.good() )
    {
        f.close();
        f.open( path.c_str(), ios::out );
        f.close();
        f.open( path.c_str(), ios::in );
    }
   
    char * buffer = new char[ sizeof( float ) ];
   
    f.read( buffer, sizeof( float ) );
    x = *( float * ) buffer;
   
    f.read( buffer, sizeof( float ) );
    y = *( float * ) buffer;
   
    f.read( buffer, sizeof( float ) );
    z = *( float * ) buffer;
   
    delete[] buffer;
    buffer = new char[ sizeof( size_t ) ];
   
    f.read( buffer, sizeof( size_t ) );
    tag = *( size_t * ) buffer;
   
    f.read( buffer, sizeof( size_t ) );
    size_t n = *( size_t * ) buffer;
   
    /*for (size_t i = 0; i < n; i++)
    {
    f.read(buffer, sizeof(size_t));
    dimensions.push_back(*(size_t*)buffer);
    }*/
   
    delete[] buffer;
   
    f.close();
}

Zmienna n powinna mieć wartość 1, a jest bardzo duża. Powinna wynosić 1, ponieważ wpisałem tam "   ˘", co odpowiada charom o numerach 0, 0, 0 i 1.
P-126217
Monika90
» 2015-02-08 22:34:32
0 0 0 1 to powinno być 16777216

lepiej zrób co Ci napisał pekfos
Odczytuj od razu do zmiennych właściwych typów.

Poniższy kod jest prawdopodobnie poprawny, używaj na własne ryzyko
C/C++
std::uint32_t size = 0;
if( f.read( reinterpret_cast < char *>( & size ), sizeof( size ) ) )
{
    dimensions.resize( size );
    f.read( reinterpret_cast < char *>( dimensions.data() ), sizeof( dimensions[ 0 ] ) * size );
}
P-126220
« 1 »
  Strona 1 z 1