fstream-pliki inne niż tekstowe

0

Robię program do szyfrowania plików. Działa bardzo dobrze jeśli działam na plikach tekstowych jednak uszkadza pliki inne niż .txt Czy za pomocą fstream można jakoś odczytywać takie pliki? W jakim formacie są dane? Czy da się czytać takie pliki linijka po linijce jak te zwykłe? Czy da się w podobny sposób zapisywać dane?

2

Otwieraj pliki z flagą ios::binary.

Czy da się czytać takie pliki linijka po linijce jak te zwykłe?
Nie, pliki binarne nie mają "linijek". Wczytuj po prostu określoną stałą ilość bajtów (ale weź pod uwagę że ostatnia paczka pod koniec pliku prawie zawsze będzie mniejsza).

2

Czy za pomocą fstream można jakoś odczytywać takie pliki

Takie to znaczy jakie? Niemniej: można.

W jakim formacie są dane?

To zależy od pliku.

Czy da się czytać takie pliki linijka po linijce jak te zwykłe?

Jeśli to pliki tekstowe (np. jakis XML) to tak. Jeśli binarne to nie, bo tam nie ma "linii".

Czy da się w podobny sposób zapisywać dane?

W podobny do czego? o_O Niemniej: da się.

0

@Shalom
1.pliki inne niż tekstowe
2.w podobny sposób do plików tekstowych.

@Azarien
nie do końca się znam na plikach binarnych... w poradniku widziałem, że ktoś wczytywał dane z pliku binarnego do dynamicznej tablicy znaków, ale nie rozumiem za bardzo jak wygląda plik binarny...

1
// obtaining file size
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  streampos begin, end;
  ifstream myfile("example.bin", ios::binary);
  begin = myfile.tellg();
  myfile.seekg(0, ios::end);
  end = myfile.tellg();
  myfile.close();
  cout << "size is: " << (end-begin) << " bytes.\n";
  return 0;
}

Do zapisu i odczytu zapraszam po .write i .read

1

@Niikelion ech, a czy np. plik excela xlsx to dla ciebie plik tekstowy czy nie? Każdy plik mozesz traktować jako binarny, bo technicznie rzecz biorąc taki właśnie jest. Składa sie po prostu z bajtów.

1

Odczyt i zapis do pliku binarnego jest zależny od tego jak autor takiego pliku rozłożył w nim dane. Tutaj masz przykład zapisu struktury do binarnego pliku:

#include <iostream>
#include <fstream>
using namespace std;

struct Ksiazka{
    int id;
    string tekst;
    double cena;
};

void zapisz(const Ksiazka& obj, const char* nazwaPliku){
    fstream plik(nazwaPliku,ios::out|ios::binary);
    if(plik.is_open()){
        plik.write((char*)&obj.id,sizeof(int));
        plik.write((char*)&obj.cena,sizeof(double));

        int rozmiar = obj.tekst.size();
        plik.write((char*)&rozmiar,sizeof(int));

        for(unsigned i = 0; i < obj.tekst.size(); ++i)
            plik.write((char*)&obj.tekst[i],sizeof(char));

        plik.close();
    }
    else cout << "Blad odczytu\n";
}

void odczytaj(Ksiazka& obj, const char *nazwaPliku){
    fstream plik(nazwaPliku, ios::in|ios::binary);
    if(plik.is_open()){
        plik.read((char*)&obj.id,sizeof(int));
        plik.read((char*)&obj.cena,sizeof(double));

        int rozmiar = 0;
        char znak = ' ';
        plik.read((char*)&rozmiar, sizeof(int));
        for(int i = 0; i < rozmiar; ++i){
            plik.read((char*)&znak,sizeof(char));
            obj.tekst = obj.tekst + znak;
        }

        plik.close();
    }
    else cout << "Blad odczytu\n";
}

void wypisz(const Ksiazka& obj){
    cout << "Tytul: " << obj.tekst << ", cena: " << obj.cena << "zl, id: " << obj.id << endl;
}

int main()
{
    Ksiazka obj;
    obj.id = 10;
    obj.cena = 145.99;
    obj.tekst = "Symfonia C++";

    const char *nazwaPliku = "test.bin";
    zapisz(obj, nazwaPliku);

    Ksiazka nowy;
    odczytaj(nowy, nazwaPliku);
    wypisz(nowy);
    return 0;
}

Jak widać z funkcji format pliku jest następujący:

  • Najpierw zapisujemy id, które jest intem;
  • Później zapisujemy cenę, która jest doublem;
  • Następnie zapisujemy rozmiar stringa, w którym trzymamy tytuł ksiązki;
  • Na końcu zapisujemy każdy znak tego stringa do pliku;
  • Po co zapisujemy rozmiar? Żeby wiedzieć ile znaków wczytać do stringa podczas wykonywania odczytu pliku.

Odczyt realizujemy identycznie.
Można kombinować dowoli.

0

a jak można by czytać pojedyncze bity? tak, żebym mógł odczytać każdy plik, niezależnie od sposobu zapisu a potem to jakoś zakodował

0

Możesz odczytać najmniej jeden bajt informacji. Taki bajt (char) możesz zamienić na liczbę binarną, zmienić bity, o które Ci chodziło i ponownie zapisać do pliku. Tylko nie mówię tutaj o zamianie na binarny system przez jakiś program. Po prosu musisz wiedzieć, że np. liczba 255 to 11111111 i np po zmianie jednego bitu będzie to już całkiem inne słowo kodowe. Np chcesz zamienić ostatni bit informacji więc do pliku zapisujesz liczbę 254 o rozmiarze sizeof(int). Najlepiej zrobić sobie edytor heksadecymalny i odczytywać każdą porcję informacji jako (char*)&zmienna, sizeof(char) czyli bajt po bajcie.

Ale uwaga: w ten sposób możesz sobie całkowicie popsuć dane, a najlepiej zrób to co radzi @fasadin, bo nie wiem czy wiesz na co się piszesz :)

2

@Niikelion nie kombinuj. Poczytaj o operacjach na plikach binarnych. Tak z 3-4 artykuly. Wtedy bedziesz wiedziec o czym mowa.

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