Dodawanie bajtów do pliku binarnego.

0

Ostatnio chcę troszkę poznać jak edytować pliki binarne, lecz w sieci jest bardzo mało tutotriali/tematów z takimi rzeczami. Pytanie moje jak można dodać bajty do pliku nie ruszając tego pliku. Ale np. żeby wstawić określone bajty w jakieś miejsce w pliku, i zapisało cały plik(nie ruszony) wraz z tymi np. czterema bajtami. Przeszukiwałem już forum, ale nic nie znalazłem co by mi pomogło. Jakieś pomysły?

0

jak można dodać bajty do pliku nie ruszając tego pliku

Nie rozumiem pytania.

żeby wstawić określone bajty w jakieś miejsce w pliku

Tak się nie da. Musisz wczytać plik do pamięci, wstawić dane w środku i zapisać ponownie.

0

http://www.cplusplus.com/reference/iostream/ostream/seekp/
http://www.cplusplus.com/reference/iostream/ostream/write/

W ten sposób wstawiasz (zastępujesz) ileś bajtów na danej pozycji.

Jeżeli chcesz wstawić bez zastępowania to musisz wczytać plik od tego miejsca do pamięci, zapisać swoje bajty i resztę pliku.

0

Aha, ok thx. Tylko jedno pytanie. Bo plik wczytuje do bufora, do pewnego miejsca, dodaje swoje bajty, i po tym wczytuje do buforu resztę pliku. Ale do tego samego buforu? Czy pierwszą część do jednego buforu, a drugą do drugiego? Ale jak wtedy zapisać? Bo zapis wygląda tak: plik.write(bufor,rozmiar);, ale jak dodać kolejny bufor aby go zapisało?

0

Moja rada: naucz się przynajmniej elementarnych podstaw programowania a potem baw się w cracking ;] Inaczej sie nie da.

0

To nie cracking. A podstawy umiem. Tylko chodzi o to że mało jest tutotriali o plikach binarnych, i muszę was pytać.. :(

0

Nie, nie znasz podstaw. To jak sobie to zrealizujesz zależy od Twojego widzi mi się, potrzeb, sytuacji. Można użyć jednego bufora, dwóch czy nawet setki jak Ci się spodoba. Można nawet żadnego nie używać.
Programowanie wymaga myślenia, a nie szukania gotowych rozwiązań w tutorialach. Tutorial ma Ci pokazać jak przeczytać plik i jak do niego zapisać - no i to by było na tyle. Resztę musisz po prostu wymyślić, ale żeby wymyślić trzeba znać język.

0

Jakiś pomysł aby zapisać np. dwa bufory po sobie?
plik.write((char*)(bufor), sizeof(rozmiar));

0
plik.write(...); //pierwszy
plik.write(...); //drugi

Trudne to nie było. Ten sizeof(rozmiar) jest tu podejrzany. Co to jest rozmiar, co i ile tego chcesz zapisać.
Najlepiej pokaż większy fragment kodu i opisz co ma robić to będzie się można do tego bardziej ustosunkować.

0

Teraz jest wszystko ok. Do końca pliku dopisuje swoje 4 bajty :):

#include <fstream>
#include <iostream>
using namespace std;
struct struktura1{
long dane1;
};
struct struktura2{
long dane2;
long dane3;
};
struct jedna{
long dan;
};

int main()
{
unsigned long long rozmiar;
int a,b,c;

fstream plik("plik2.bin",ios::in|ios::out|ios::binary);
if(plik){
plik.seekg( 0, ios::end );
rozmiar = plik.tellg();
plik.seekg( 0, ios::beg );
cout << "Rozmiar pliku to: " << rozmiar << " Bajtow"<< endl;
}

char *bufor=new char[rozmiar];
plik.seekg(0,ios::beg);
plik.read(bufor,rozmiar);
plik.seekg(0,ios::beg);
struktura1 P=(struktura1)bufor;
struktura2 K=(struktura2)(4+bufor);
K->dane2=5432;
P->dane1=1200;
plik.write(bufor,rozmiar);
plik.close();
//------------------------------------------------

fstream plik2("plik2.bin",ios::in|ios::out|ios::binary);
plik2.seekg(0,ios::beg);
char bufor2=new char[rozmiar];
plik2.seekg(0,ios::beg);
jedna
j = new jedna;
plik2.seekg(0,ios::beg);
plik2.read(bufor2,rozmiar);
plik2.seekg(0,ios::beg);
cin >> j->dan;
int i=0;
plik2.write((bufor),(rozmiar));
plik2.write((char*)(j), sizeof(4));

system("pause");

return (0);
}

0

Teraz jest wszystko ok. Do końca pliku dopisuje swoje 4 bajty
(...)

plik2.write((char*)(j), sizeof(4));

Niektórzy to mają szczęście ;).

Może zainteresuje Cię to że sizeof(4) może wynosić 1, 2, 4, 8, na dobrą sprawę nawet 32 albo 666 (zależy od kompilatora). Za to możesz mieć pewność że sizeof(1) == sizeof(2) == sizeof(4) == sizeof(8) == sizeof(32).

Dlaczego? Otóż to sizeof trochę z sufitu wziąłeś - sizeof zwraca wielkość w bajtach jaką zajmuję obiekt (ok, 'obiekt') przekazany jako 'parametr'. W tym przypadku wielkość inta.

unsigned long long rozmiar;
Tak samo sizeof(rozmiar) jest prawdopodobnie (zależy od kompilatora) równy 8 u Ciebie. Zawsze.

Rozwiązanie? Jeśli chcesz napisać 4 bajty, zamiast sizeof(4) daj 4 po prostu.

0
msm napisał(a):

Otóż to sizeof trochę z sufitu wziąłeś - sizeof zwraca wielkość w bajtach jaką zajmuję obiekt (ok, 'obiekt') przekazany jako 'parametr'. W tym przypadku wielkość inta.

A nie przypadkiem wielkość w wielokrotnościach chara? Z tym, że char często ma po prostu 1 bajt, dlatego tak sie przyjęło, ale z tego co wiem to jeżeli sizeof zwraca 2 to znaczy ze obiekt zajmuje 2 razy tyle, co zwykły char :)

0

Oboje macie racje.
http://en.wikipedia.org/wiki/Sizeof
"measured in the number of bytes required to represent the type. A byte in this context is the same as an unsigned char, and may be larger than 8 bits, although that is uncommon"
więc MSM dobrze podał że zwraca wielkość w bajtach, a to jak liczony jest bajt to już inna kwestia :)

0

C99:

2 The sizeof operator yields the size (in bytes) of its operand, which may be an
expression or the parenthesized name of a type. The size is determined from the type of
the operand. The result is an integer. If the type of the operand is a variable length array
type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an
integer constant.

3 When applied to an operand that has type char, unsigned char, or signed char,
(or a qualified version thereof) the result is 1
. When applied to an operand that has array
type, the result is the total number of bytes in the array.85)

C++03 == C++11:

1 The sizeof operator yields the number of bytes in the object representation of its operand. The operand is either an
expression, which is not evaluated, or a parenthesized type-id. The sizeof operator shall not be applied to an expression
that has function or incomplete type, or to an enumeration type before all its enumerators have been declared, or to
the parenthesized name of such types, or to an lvalue that designates a bit-field. sizeof(char), sizeof(signed
char) and sizeof(unsigned char) are 1.
The result of sizeof applied to any other fundamental type (3.9.1) is
implementation-defined. [ Note: in particular, sizeof(bool) and sizeof(wchar_t) are implementation-defined.74)
—end note ] [ Note: See 1.7 for the definition of byte and 3.9 for the definition of object representation. —end note ]

Czyli czy powiesz wielokrotności chara czy wielkość w bajtach - wychodzi na to samo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1