Odczyt ciągu znaków z pliku binarnego – potrzebny przykład

0

Cześć,
mam problem z odczytem pliku? czy ktoś może mi napisać przykładowy algorytm odczytu pliku binarnego ze stringiem?
Czy poniższy zapis jest prawidłowy? Kiedy zapisuje go jako plik binarny i otwieram to widzę dokładnie to co wpisałem czy nie powinno zamiast tego być losowe znaki?

#include<iostream>
#include<fstream>
#include<string>
#include<cstdlib>

using namespace std;

struct student
{
    string imie;
    string kierunek;
};

int main()
{

    int n;
    cout<<"Podaj rozmiar : ";
    cin>>n;
    cin.get();
    student s[n];

    fstream plik;
    plik.open("test.dat", ios_base::binary | ios_base::out | ios_base::app );

    for( int i = 0 ; i<n; i++)
    {
        cout<<"Podaj imie : ";
        getline(cin,s[i].imie);
        plik.write(s[i].imie.c_str(), s[i].imie.size()+1 );

        cout<<"Kierunek : ";
        getline(cin, s[i].kierunek);
        plik.write( s[i].kierunek.c_str(), s[i].kierunek.size()+1);

    }
plik.close();



fstream plik1;
plik1.open("test.dat", ios_base::binary | ios_base::in );




plik1.close();
    return 0;}

1

czy nie powinno zamiast tego być losowe znaki?

Dlaczego miałyby być losowe znaki?

0

no bo to plik binarny? czy nie powinny być tzw. krzaczki ?

2

Dlaczego?

Plik binarny nie implikuje żadnego szyfrowania.

0

ok. A co zapis do pliku binarnego jest ok? i co z odcztem?

0
std::ostream &binaryWrite(std::ostream &out, const std::string &s) {
    uint32 size = s.size();
    if (out.write(reinterpret_cast<char *>(&size), sizeof(size)))
        out.write(s.data(), size);
    return out;
}

std::istream &binaryRead(std::istream &in, std::string &s) {
    uint32 size;
    if (in.read(&size, sizeof(size))) {
        s.resize(size);
        in.read(s.data(), size);
    }
    return in;
}

std::ostream &binaryWrite(std::ostream &out, const Student &student) {
     if (binaryWrite(out, student.imie)
         binaryWrite(out, student.kierunek);
     return os;
}

std::istream &binaryRead(std::istream &in, Student &student) {
   ...
}
0

Pliki binarne nie zawierają z definicji krzaczków.

Kiedy do pliku tekstowego zapiszesz liczbę 1, zapisze ci się w nim liczba 49, bo taki jest kod ASCII znaku 1.
Kiedy zapiszesz liczbę 1 do pliku binarnego, będziesz tam mieć właśnie liczbę 1.
Edytory tekstowe nie wiedzą, jak pokazać znak o numerze 1, więc wypełniają to krzaczkami.

Zrób sobie coś takiego:

cout << 0 << " -> " << (int)'0'  << endl;

W pliku tekstowym zapiszesz wartość po prawej, w pliku binarnym - wartość po lewej.

1

@kamillapinski: pliki binarne z definicji zawierają mnóstwo krzaków, bo nie są to pliki czysto tekstowe (czyli w całości zawierające dane możliwe do reprezentacji konkretnego, ”czytelnego” tekstu w konkretnym kodowaniu znaków).


Każdy bajt danych w pliku binarnym może przyjmować wartość pasującą np. do znaku alfanumerycznego w danym kodowaniu, ale też jakąś zupełnie inną. Problemem nie jest tutaj krzaków istnienie czy nie, ale brak zrozumienia tego czym są pliki i czym są dane w nich zapisane, a także czym są owe krzaki.

Dane w jakimkolwiek pliku to nic innego jak ciągi bajtów, możliwych do wizualizacji w postaci tekstu (pliki tekstowe), obrazów (pliki graficzne), dźwięku (pliki dźwiękowe) itd. Kwestia tego w jaki sposób spróbujemy ich zawartość przedstawić na ekranie.

Natomiast krzaki to po prostu liczby, wyświetlone na ekranie w postaci znaków, gdzie wartości liczbowe pokrywają się z kodami dziwnie wyglądających, normalnych znaków (lub znaków kontrolnych, które w niektórych edytorach mogą posiadać graficzną reprezentację).

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