m97 Opublikowano 31 Sierpnia 2012 Udostępnij Opublikowano 31 Sierpnia 2012 Witam, szukałem czegoś na temat nadpisywania plików binarnych w dokumentacji, ale nie znalazłem. Mój problem polega na tym, że nie mogę zmienić pojedynczego bajtu w pliku. Przepisywanie pliku na nowo nie wchodzi w grę bo jest to duży plik. Kiedy próbuję nadpisać bajt i ustawiam na niego pozycję pisania w pliku to tworzy mi się nowy bajt obok tego, który chciałem zmienić. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 31 Sierpnia 2012 Udostępnij Opublikowano 31 Sierpnia 2012 Może źle otwierasz plik, musisz otworzyć z opcją nadpisywanie, jest w dokumentacji. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 31 Sierpnia 2012 Administratorzy Udostępnij Opublikowano 31 Sierpnia 2012 file_bin_seek(fileid,pos) ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
m97 Opublikowano 31 Sierpnia 2012 Autor Udostępnij Opublikowano 31 Sierpnia 2012 Zapomniałem dodać że do plików używam specjalnego dll. Podaję dostępne w nim tryby odczytu pliku: f_bin_open(filename,mode) - Opens a file in binary mode. Filename is the file name (absolute or relative). Mode should be: 1 = tf_mode_read: Opens for reading. Returns an error if the file does not exist. 2 = tf_mode_write: Opens for writing and clears the existing file. Creates the file if it does not exist. 3 = tf_mode_append: Opens for writing and sets the position to the end of the file. Creates the file if it does not exist. Returns a file id (1-16) or 0 if the file could not be opened, or -1 if an error occurred (invalid mode or more than 16 files opened). Oto mój kod: GML if(liczba_modyfikowanych_obiektow > 0){ f_bin_close(id_mapa_plik); id_mapa_plik_zapis = f_bin_open("domyslny_swiat/mapa.dat",3); for(a = 0;a < liczba_modyfikowanych_obiektow;a+= 1){ miejsce_zapisu = modyfikowane_obiekty[a,0]*125+modyfikowane_obiekty[a,1]; f_bin_seek(id_mapa_plik_zapis,miejsce_zapisu) b = ds_grid_get(id_mapy_obiektow,modyfikowane_obiekty[a,0],modyfikowane_obiekty[a,1]); f_bin_write_byte(id_mapa_plik_zapis,b) } f_bin_close(id_mapa_plik_zapis); id_mapa_plik = f_bin_open("domyslny_swiat/mapa.dat",1); } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 31 Sierpnia 2012 Udostępnij Opublikowano 31 Sierpnia 2012 Magiczna 3. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
m97 Opublikowano 31 Sierpnia 2012 Autor Udostępnij Opublikowano 31 Sierpnia 2012 Otwieram plik trójką i stwierdziłem, że przy każdej próbie modyfikacji jednego bajtu rozmiar pliku rośnie o jeden bajt. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 31 Sierpnia 2012 Udostępnij Opublikowano 31 Sierpnia 2012 W takim razie twórca dll coś zje..ł Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 31 Sierpnia 2012 Administratorzy Udostępnij Opublikowano 31 Sierpnia 2012 Jak używasz DLL, to pewnie jest tam jakaś funkcja - tylko nie wiem jaka, bo nie wiem co to za DLL i jakie ma funkcje edit: bo append to "dopisz", czyli dopisuje bajty na końcu, normalne Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ediepl Opublikowano 31 Sierpnia 2012 Udostępnij Opublikowano 31 Sierpnia 2012 A spróbuj użyć 2. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
m97 Opublikowano 31 Sierpnia 2012 Autor Udostępnij Opublikowano 31 Sierpnia 2012 Oto wszystkie funkcje dla plików binarnych: All functions for reading/writing multi-byte integers use the big-endian format, which means the bytes that represent the biggest values are saved first. For example, 276 will be saved as 0-1-20. f_bin_open(filename,mode) - Opens a file in binary mode. Filename is the file name (absolute or relative). Mode should be: 1 = tf_mode_read: Opens for reading. Returns an error if the file does not exist. 2 = tf_mode_write: Opens for writing and clears the existing file. Creates the file if it does not exist. 3 = tf_mode_append: Opens for writing and sets the position to the end of the file. Creates the file if it does not exist. Returns a file id (1-16) or 0 if the file could not be opened, or -1 if an error occurred (invalid mode or more than 16 files opened). f_bin_read_byte(fileid) - Reads a byte from the file. Returns the value of the byte, or 0 if the end of the file was reached. Returns 0 if an error occurred (invalid file id). f_bin_read_byte2(fileid) - Reads 2 bytes from the file. Returns the value of the bytes, or 0 if the end of the file was reached. Returns 0 if an error occurred (invalid file id). f_bin_read_byte3(fileid) - Reads 3 bytes from the file. Returns the value of the bytes, or 0 if the end of the file was reached. Returns 0 if an error occurred (invalid file id). f_bin_write_byte(fileid,number) - Writes a byte to the file. Number can be 0-255. Returns 1, or -1 if an error occurred (invalid file id). f_bin_write_byte2(fileid,number) - Writes 2 bytes to the file. Number can be 0-65535. Returns 1, or -1 if an error occurred (invalid file id). f_bin_write_byte3(fileid,number) - Writes 3 bytes to the file. Number can be 0-16777215. Returns 1, or -1 if an error occurred (invalid file id). f_bin_read_chars(fileid,length) - Reads length bytes from the file and returns them as a string. All NULL bytes in the string will be removed. Returns an empty string if an error occurred (invalid file id). f_bin_write_chars(fileid,length,string) - Writes length bytes from the string to the file. If the string is shorter than length the remaining bytes will be filled with NULL bytes. If the string is longer it wil be truncated. Returns 1, or -1 if an error occurred (invalid file id). f_bin_eof(fileid) - Returns whether the last reading function failed because it reached the end of the file. Normally your game should not depend on this function, but use it only for error checking. Returns -1 if an error occurred (invalid file id). f_bin_seek(fileid,pos) - Sets the current reading/writing position of the file. f_bin_memoryerror(fileid) - Returns whether reading failed because of a memory error since the last call of this function. This will only happen if there was not enough free memory. Returns -1 if an error occurred (invalid file id). f_bin_close(fileid) - Closes the file with id fileid. Returns whether successful (almost always), or -1 if an error occurred (invalid file id). If the function fails, the file will still be closed but it might be corrupted. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 31 Sierpnia 2012 Administratorzy Udostępnij Opublikowano 31 Sierpnia 2012 f_bin_open(filename,2) f_bin_seek(fileid,pos) pos to pozycja bajtu Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
m97 Opublikowano 31 Sierpnia 2012 Autor Udostępnij Opublikowano 31 Sierpnia 2012 Ale 2 czyści mi cały plik, a ja chcę zmienić pojedynczy bajt. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się