• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Zakodowanie danych do pliku i odczyt tych danych.

Object Storage Arubacloud
0 głosów
942 wizyt
pytanie zadane 5 sierpnia 2015 w C i C++ przez bokamix Nowicjusz (230 p.)

Witam. Mam program , w którym raz okreslam wartość zdan a,b,c,d,e.

Zdania te przy każdym włączeniu programu są wczytywane i mam możliwość albo nadpisania ich wartości, albo kontynuowanie na danych ,wpisałem przy p[ierwszym uruchomieniu programu.

Teraz chciałbym zabezpieczyć te pytania, zakodować tak ,żeby w pliku nie można było odczytać co zostało wpisane w wartościach a,b,c,d,e. 

Jak się za to zabrać? Nie do konca wiem jak to zgrac z moim programem. Odpalcie go sobie i sprawdzcie jak dziala i jeśli możecie nakierujcie mnie jakoś

#include <iostream>
#include <windows.h>
#include <time.h>
#include <fstream>
#include <cstdlib>

using namespace std;

int liczba,losy;
string coDalej,a,b,c,d,e;

int main()
{
    cout << "Chcesz 'edytowac' czy isc 'dalej': ";
    cin >> coDalej;
    cout << endl << endl;
    if(coDalej=="edytowac")
    {
        cout << "Podaj a: ";
        cin.ignore(1);
        getline(cin,a);

        cout << "Podaj b: ";
        cin.ignore(1);
        getline(cin,b);

        cout << "Podaj c: ";
        cin.ignore(1);
        getline(cin,c);

        cout << "Podaj d: ";
        cin.ignore(1);
        getline(cin,d);

        cout << "Podaj e: ";
        cin.ignore(1);
        getline(cin,e);

        fstream plik;
        plik.open("dane.txt",ios::out);

        plik << a << endl;

        plik << b << endl;

        plik << c << endl;

        plik << d << endl;

        plik << e << endl;

        plik.close();
    }
    else if(coDalej=="dalej")
    {
        string linia;
        int nr_linii=1;

        fstream plik;
        plik.open("dane.txt", ios::in);

        if(plik.good()==false)
            cout << "Nie mozna otworzyc pliku!";

        while(getline(plik, linia))
        {
            switch(nr_linii)
            {
                case 1:
                    a=linia;
                    break;
                case 2:
                    b=linia;
                    break;
                case 3:
                    c=linia;
                    break;
                case 4:
                    d=linia;
                    break;
                case 5:
                    e=linia;
                    break;
            }
            nr_linii++;
        }
        plik.close();
    }

    cout << "Witaj w losowaniu! Podaj liczbe losow: ";
    cin >> losy;
    cout << endl;
    srand(time(NULL));

    for(int i=0;losy>i;losy--)
    {
        liczba=rand()%100+1;
        Sleep(100);

        if(liczba<=5)
        {
            cout << d << endl;
        }
        else if(liczba>=6&&liczba<=11)
        {
            cout << c << endl;
        }
        else if(liczba>=50&&liczba<=52)
        {
            cout << a << endl;
        }
        else if(liczba>=60&&liczba<=63)
        {
            cout << b << endl;
        }
        else if(liczba>=70&&liczba<=80)
        {
            cout << e << endl;
        }
    }

    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 5 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Skorzystaj z plików binarnych. Wartości będą wtedy zapisywane nie jako tekst, ale jako liczby dwucyfrowe odpowiadające jednemu bajtowi (jeśli chodzi o system szesnastkowy). W takim sposób, gdy użytkownik będzie chciał zmodyfikować plik, to wtedy zobaczy "krzaczki", czyli bezsensowne znaki.

Tutaj masz sposób na zapis i odczyt takich plików: http://4programmers.net/C/Artyku%C5%82y/Odczyt_i_zapis_plik%C3%B3w_binarnych_w_Cpp.

komentarz 5 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Jeśli będziesz miał problemy z wartościami, to najprawdopodobniej będziesz musiał pozamieniać kolejność bajtów w pliku: https://pl.wikipedia.org/wiki/Kolejno%C5%9B%C4%87_bajt%C3%B3w.

komentarz 6 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
A jak ogaranac sprawe tak, zeby zapisane dane nie zostawały ciągle nadpisywane ?
komentarz 6 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

@Dragonet.17 Możesz użyć specjalnego modu, który przed odczytem pliku usuwa jego zawartość. Nazywa się std::ios::trunc. Oto przykład użycia:

plik.open("plik.txt", std::ios::binary | std::ios::trunc);

Wtedy powinieneś zawsze pracować na czystym pliku.

Życzę powodzenia!

komentarz 6 sierpnia 2015 przez niezalogowany
@Patrycjerz - ty gnoju!!! To ja ci to powiedziałem https://forum.pasja-informatyki.pl/42050/jak-stworzyc-zabezpieczony-plik-poziomu-gry :D Nawet od ciebie dostałem najlepszą odpowiedź XD Ale jednak ty byłeś tutaj szybciej ;) Ważne, że mu pomogliśmy ;)
komentarz 6 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Ja gnojem! Haha, no trochę, ale w mojej odpowiedzi chciałem zawrzeć kilka spraw, których ty nie zawarłeś, m.in. z tą kolejnością bitów (stworzyłem o tym nawet pytanie na forum i wygryzłem przez to wszystkie paznokcie laugh). I oczywiście jeszcze raz dzięki, bo to ty mi to pokazałeś wink

komentarz 6 sierpnia 2015 przez niezalogowany
Ach, nie ma za co :3 Ale rzeczywiście, ja tylko podałem linka. A wiesz czemu? Bo sam za dużo na ten temat nie wiem ;D
komentarz 6 sierpnia 2015 przez Dragonet.17 Pasjonat (19,630 p.)
Ale chodzi o to, aby text ktory jest w pliku nie został usuwany, tylko aby z czasem "dodawać" kolejne linie w tekście, bez ich zmieniania :D
komentarz 6 sierpnia 2015 przez niezalogowany
Aha, no to to wiem od dawna ;)
komentarz 6 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

@Dragonet.17 Bardzo dobre pytanie wink Przez chwilę głowiłem się nad tym (tryb std::ios::binary automatycznie czyści plik przy odczycie, więc tamta odpowiedź z std::ios::trunc nie ma sensu) i w końcu znalazłem odpowiedź w dokumentacji metody open. Jest nim tryb std::ios::app. Umożliwia on dodanie zawartości na koniec pliku bez zmieniania wcześniejszej.

Oto przykład:

plik.open("plik.txt", std::ios::binary | std::ios::app);

Nawet ci podziękuję za to pytanie, bo sam się czegoś nowego dowiedziałem. Trzymaj się!

komentarz 6 sierpnia 2015 przez niezalogowany
No właśnie też tak coś się zastanawiałem, bo patrzę, mu chodzi o to, żeby treść nie była usuwana, a dałeś trunc (truncate), zamiast app (append). Ale to, że app dodaje treść do tej co była to też już dawno wiedziałem ;)
komentarz 6 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Filipekczek, ty to jak zawsze skromny jesteś laugh

komentarz 6 sierpnia 2015 przez niezalogowany
Oj tak: mądry, inteligentny, wysportowany, zabawny, przystojny, ale przede wszystkim skromny ;D

Podobne pytania

0 głosów
0 odpowiedzi 189 wizyt
0 głosów
2 odpowiedzi 667 wizyt
pytanie zadane 15 kwietnia 2015 w C i C++ przez criss Mędrzec (172,590 p.)
0 głosów
1 odpowiedź 1,181 wizyt

92,579 zapytań

141,432 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...