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

Wczytanie pliku z bajtami 0x00

Ostatnio zmodyfikowano 2015-07-19 11:52
Autor Wiadomość
MinusPL
Temat założony przez niniejszego użytkownika
Wczytanie pliku z bajtami 0x00
» 2015-07-18 23:01:05
Problem polega na tym, że stosując standardowe FILE lub fstream nie mogę wczytać w żaden sposób pliku zawierającego bajty 0x00 (NULL).
Próbowałem wykorzystywać funkcje read z ifstream, otwierałem plik w trybie zwykłym i binarnym. W przypadku FILE to samo tryb zwykły i binarny, funkcje fgetc, fgets oraz fread nie działają. Albo gubią się na bajcie 0x00 (gdzieś przeczytałem, że C++ traktuje go jako znak EOF), albo wczytane dane są całkowicie inne. Nie mogę zamieścić kodu, bo nie mam go chwilowo pod ręką. Byłbym wdzięczny gdyby ktoś mi wytłumaczył jak wczytać plik w z tymi bajtami (jest mi potrzebna dokładna jego struktura do późniejszego zaszyfrowania). Jak tylko będę mógł umieścić kod to go dodam oraz jeśli będzie potrzeba ten plik, który chcę wczytać. Z góry dziękuję za pomoc
P-134874
pekfos
» 2015-07-18 23:04:44
Tryb binarny, read()/write(), fread()/fwrite(). Musisz mieć błąd w kodzie.
P-134875
MinusPL
Temat założony przez niniejszego użytkownika
» 2015-07-18 23:16:26
C/C++
FILE * inputFile;
inputFile = fopen( "test.ini", "rb" );

fseek( inputFile, 0, SEEK_END );
int fileSize = ftell( inputFile );
rewind( inputFile );

char * fileBuf = new char[ fileSize ];
char buffer;

int byte_counter = 0;

bool checker = false;

while( byte_counter <= fileSize )
{
    fread( & buffer, 1, 1, inputFile );
    memcpy( & fileBuf[ byte_counter ], & buffer, sizeof( buffer ) );
    byte_counter++;
}


printf( "%s\n", fileBuf );

fclose( inputFile );

Udało mi się dokopać do kodu, nawet szybko. Faktycznie po głębszej analizie fread wczytuje pojedyncze bajty bez problemu, zgodnie z zakładaniem tematów nie powinienem ale spytam się...
Jak przekopiować pojedynczy wczytany znak char tak aby w tablicy fileBuf bajty 0x00 były odpowiednio używane? W Visualu wartość zmiennej kończy się na 8 lub 9 bajcie (potem są tylko 0x00, aż do 20 bajtu) i dalszych wartości w tablicy char nie ma.
P-134876
pekfos
» 2015-07-19 11:52:49
To nie problem kopiowania, tylko sposobu wyświetlania. Tak, C i C++ traktują znak zera specjalnie, ale nie jako EOF, tylko jako koniec tekstu w pamięci. Nie możesz tu użyć %s, bo wyświetlanie skończy się na pierwszym zerze.

C/C++
fread( & buffer, 1, 1, inputFile );
memcpy( & fileBuf[ byte_counter ], & buffer, sizeof( buffer ) );
byte_counter++;
Jaki jest tego cel? Czemu nie wczytujesz wszystkiego za jednym razem, od razu do fileBuf? fread() zwraca ilość poprawnie wczytanych elementów, w twoim przypadku bajtów. Nie potrzebujesz żadnych liczników, chyba że chcesz sobie komplikować kod. Jedno wywołanie operacji I/O jest znacznie szybsze, niż tysiące takich wywołań.
P-134898
« 1 »
  Strona 1 z 1