2010-08-18 15 views
5

Czy jest możliwa aktualizacja tylko części pliku w języku C++?Aktualizuj tylko część pliku binarnego za pomocą C++

Przykład:

stary plik A: 'A''A''A''B''B''C''C''C'
Nowy plik A: ' A''A''A”«X''X»«C''C''C»

jako rzeczywiste pliki nie są tak małe jak te przykłady, a ja wiem dokładnie, co się zmieniło (offset i writeLenght dla zmienionej zawartości) byłoby świetnie móc otworzyć plik, ustawić strumień we właściwej pozycji, zapisać informacje i zamknij plik ponownie .... ale to doprowadzi do pliku, który wygląda następująco:

Zaktualizowany plik: '0''0''0''X''X''C''C' ' C”

jest to kod użyłem:

void update file(list<unsigned char> content, int offset){ 

fs::basic_ofstream<char> fileStream(path , ios::out | ios::binary);  
list< unsigned char >::const_iterator contentIter = content.begin(); 
// begin write operation at the offset 
advance(contentIter , offset); 
fileStream.seekp(offset); 
while(contentIter != content.end()){ 
    unsigned char value = (char)*contentIter; 
    fileStream.put(value); 
    ++contentIter;   
} 
fileStream.close(); 

czy istnieje sposób, aby to zrobić, lub cały plik ma zostać przepisany za każdym razem zmienia?

Dziękujemy

Odpowiedz

3

Ok, dziękuję:
Oto fragment kodu działa na wypadek gdyby ktoś napotka to samo pytanie.

void update file(list<unsigned char> content, int offset, int writeLength){ 

fs::basic_fstream<char> fileStream(path , ios::out | ios::in | ios::binary);  
list< unsigned char >::const_iterator contentIter = content.begin(); 
// begin write operation at the offset 
advance(contentIter , offset); 
// set the Stream to the offset position 
fileStream.seekp(offset); 
while(contentIter != content.end() && writeLength != 0){ 
    unsigned char value = (char)*contentIter; 
    fileStream.put(value); 
    ++contentIter; 
    --writeLength;   
} 
fileStream.close(); 
} 

Trzeba sprawdzić błędy lub powiedzieć strumień rzucać wyjątki przy użyciu tego kodu ....

7

Masz dobry pomysł. Najważniejszą rzeczą, którą musisz zmienić, jest użycie fstream zamiast ofstream i użycie ios::in | ios::out po jej otwarciu (zakładając, że fs::basic_ofstream w jakiś sposób rozwiązuje się pod fs::basic_ofstream pod kątem). Gdy otworzysz tylko z ios::out istniejąca zawartość pliku zostanie zniszczona.

Edycja: Przy okazji, trudno mi sobie wyobrazić sytuację, w której używanie std::list<char> jest dobrym pomysłem. Na typowej maszynie z 32-bitowymi wskaźnikami i 8-bitowymi char s, szukasz sposobu użycia 8-krotnie dużo miejsca na wskaźniki, tak jak w przypadku danych, które próbujesz przechowywać, oraz dostępu do danych, które Sklep jest również dość powolny.

+0

Dziękuję za odpowiedź. Właśnie tego szukałem. Dotyczy znaków: Piszę program testów warunków skrajnych dla kart pamięci flash. Muszę umieć generować wzorce, w których każdy bajt ma określoną wartość. Wzory te są przechowywane wewnętrznie i zapisywane do pliku. Od czasu do czasu odczytywam je i porównuję z zapisanymi wzorami. Mogę wtedy określić dokładną pozycję błędu i sprawdzić, czy jest on odtwarzalny. – zitroneneis

3

Nie jak C++ 'owski, ale oczywisty sposób to zrobić to z pamięci mapowane pliki

Powiązane problemy