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

Funkcja nie zapisuje danych do pliku binarnego

Object Storage Arubacloud
0 głosów
119 wizyt
pytanie zadane 7 lipca 2019 w C i C++ przez DamianW Bywalec (2,080 p.)
edycja 7 lipca 2019 przez DamianW

Witam, mam pewien problem z zapisem danych do pliku binarnego. Otóż próbuję to zrobić przekazując zmienną fstream do funkcji poprzez referencję. Program się kompiluje bez problemów. Natomiast żadne dane do pliku nie są zapisywane. Plik ma rozmiar 0KB , a jak otworzyłem go w edytorze do edycji plików .bin również była pustka. Bawiłem się z prawami dostępu w folderze i pliku, niestety na nic się do nie zdało. Dlatego musi coś być nie tak z moim kodem, ale nie mam pojęcia co to może być. Próbowałem przekazać zmienną poprzez wskaźnik oraz referencję, nadal to samo. Przekazanie zmiennej poprzez kopiowanie(normalnie) kończy się wysypaniem kilku błędów w kompilatorze. Staram się unikać używania zmiennych globalnych. Zamieszczam tylko fragment kodu,który jest odpowiedzialny za zapis do pliku.Przejścia do kolejnych funkcji podświetliłem.  Z góry bardzo dziękuję za pomoc.

int main()
{
    fstream file;
    file.open("data.bin",ios::in | ios::out | ios::binary);

    int quant_of_blocks = 0;
    int selected_N_block = 0;
    Data *selected_block = NULL;


    if (file.is_open())
        cout << "Otworzono plik!" << endl;
    else
    {
        cout << "Nie udalo sie otworzyc pliku, wychodze z programu" << endl;
        return 0;
    }
    vector<Data*> Data_table;

for (int i = 0 ;i < 2; i++)
{
    if (selected_block != NULL)
        menu_loop(Data_table,&selected_N_block,&quant_of_blocks,file);
    else
    {
        char decision;
        cout << "Nie stworzono zadnego bloku danych, opcje menu sa niedostepne" << endl;
        cout << "Stworzyc pierwszy blok danych?(y -tak, inny znak - nie)" << endl;
        cin >> decision;
        if ((decision == 'y')||(decision == 'Y'))
        {
            Data_table.push_back(create_new_data_block());
            quant_of_blocks = 1;
            selected_block = Data_table[0];
        }
        else
        {
            cout << "Wychodze z programu" << endl;
        }
    }
}
    file.close();
    return 0;
}


void menu_loop(vector<Data*> Data_table,int* selected_N_block,int* quant_of_blocks,fstream &file)
{
    for (;;)
    {
        if (quant_of_blocks == 0)
            break;
        switch(Menu(Data_table[*selected_N_block]))
        {
        case 1:
            {
                Data_table.push_back(create_new_data_block());
                (*quant_of_blocks)++;
                break;
            }
        case 2:
            {
                if ((*selected_N_block < 0)||(*selected_N_block >= *quant_of_blocks))
                    cout << "Nie wybrano zadnego bloku danych" << endl;
                else
                {
                    system("pause");
                    Data_table[*selected_N_block]->save_to_file(file);
                }
                break;
            }
        case 3:
            {
                cout << "Wybierz numer bloku danych : ";
                int buffer ;
                cin >> buffer;
                if (( (buffer) >= 1 ) & ( (buffer) <= *quant_of_blocks))
                {
                    *selected_N_block = buffer - 1;
                }
                else
                {
                    cout << "Nie ma bloku o takim numerze" << endl;
                    system("pause");
                }
                break;
            }
        case 4:
            {
                show_all_data(Data_table,*quant_of_blocks);
                break;
            }
        default :
            {
                cout << "Brak takiego polecenia" << endl;
                system("pause");
            }
        }
    }
}

void Data::save_to_file(fstream &file)
{

    /// 1-score int OK
    if (file.write(reinterpret_cast<char*>(&score),sizeof(score)))
    {
      cout <<score<< endl;
      cout << "1ok" << endl;
      system("pause");
    }
    /// 2-club string
    file.write(club.c_str(),length_club + 1);
    /// 3-club length int
    file.write(reinterpret_cast<char*>(&length_club),sizeof(length_club));
    cout << "2ok" << endl;
    system("pause");

    /// 4-name string
    file.write(name.c_str(),length_name + 1);
    /// 5-name length int
    file.write(reinterpret_cast<char*>(&length_name),sizeof(length_name));

    cout << "3ok" << endl;
    system("pause");

    /// 6-zamkniêcie
    file.write("#",sizeof("#"));
    if_saved = true;
}

 

komentarz 8 lipca 2019 przez tkz Nałogowiec (42,000 p.)

A mógłbyś pokazać wszystko? 

Czy na pewno inicjalizujesz score?

std::fill_n(std::ostreambuf_iterator<char>(file), rozmiarpliku, comawstawic);

Może spróbuj tym.

komentarz 8 lipca 2019 przez DamianW Bywalec (2,080 p.)

Projekt jest podzielony na kilka plików, więc spróbuję zamieścić tutaj wszystko , chociaż jest tego sporo.

/// insert_data.h

#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <vector>

using namespace std;
#ifndef INSERT_DATA_H
#define INSERT_DATA_H


class Data
{
private:

    int score;

    string name;
    int length_name;

    string club;
    int length_club;

    bool if_saved;

public:
    Data ();
    Data (int new_score,string new_name,string new_club);
    void save_to_file(fstream &file);
    void show_data() const;
};

#endif // INSERT_DATA_H

/// menu_details.h

#include "insert_data.h"

using namespace std;

#ifndef MENU_DETAILS_H
#define MENU_DETAILS_H

int Menu (Data* data_block);
void menu_loop(vector<Data*> Data_table,int* selected_N_block,int* quant_of_blocks,fstream &file);
Data* create_new_data_block ();

#endif // MENU_DETAILS_H

/// insert_data.cpp

#include "insert_data.h"

using namespace std;

Data::Data():
    score(0),name("NONE"),club("NONE"),if_saved(false)
{
    length_club = club.length() + 1; /// znak konca NULL
    length_name = name.length() + 1; /// znak konca NULL

}

Data::Data (int new_score,string new_name,string new_club):
    score(new_score),name(new_name), club(new_club), if_saved(false)
{
    length_club = club.length() + 1; /// znak konca NULL
    length_name = name.length() + 1; /// znak konca NULL
}


void Data::save_to_file(fstream &file)
{

    /// 1-score int OK
    if (file.write(reinterpret_cast<char*>(&score),sizeof(score)))
    {
      cout <<score<< endl;
      cout << "1ok" << endl;
      system("pause");
    }
    /// 2-club string
    file.write(club.c_str(),length_club + 1);
    /// 3-club length int
    file.write(reinterpret_cast<char*>(&length_club),sizeof(length_club));
    cout << "2ok" << endl;
    system("pause");

    /// 4-name string
    file.write(name.c_str(),length_name + 1);
    /// 5-name length int
    file.write(reinterpret_cast<char*>(&length_name),sizeof(length_name));

    cout << "3ok" << endl;
    system("pause");

    /// 6-zamkniêcie
    file.write("#",sizeof("#"));
    if_saved = true;
}

void Data::show_data() const
{
    cout <<"Punkty :"<<score<<"  Imie :"<<name<<"  Klub :"<<club<<endl;
}

/// menu_details.cpp

#include "menu_details.h"

using namespace std;

int Menu (Data* data_block)
{
    int decision;
    system("cls");
    cout << "Obecnie zaznaczony blok danych" << endl;
    data_block->show_data();
    cout << "    MENU"<<endl;
    cout <<"1.Tworz nowy blok danych"<<endl;
    cout <<"2.Zapisz do pliku zaznaczony blok danych" <<endl;
    cout <<"3.Zaznacz blok danych" << endl;
    cout <<"4.Pokaz wszystkie bloki danych(dostepne w programie)" << endl;
    cout <<"5.Zapisz do pliku wszystkie bloki danych" <<endl;
    cout << ": ";
    cin >> decision;
    return decision;
}

Data* create_new_data_block ()
{
    string new_name;
    string new_club;
    int new_score;

    cout << "Nadaj odpowiednie dane." << endl;

    cout << "Klub :";
    cin >> new_club;

    cout << "Punkty :";
    cin >> new_score;

    cout << "Imie :";
    cin >> new_name;

    Data *new_data_block = new Data(new_score,new_name,new_club);
    return new_data_block;
}

void show_all_data (vector<Data*> Data_table,int quant_of_blocks)
{
    for (int i=0;i<quant_of_blocks;i++)
        Data_table[i]->show_data();
    system("pause");
}

void menu_loop(vector<Data*> Data_table,int* selected_N_block,int* quant_of_blocks,fstream &file)
{
    for (;;)
    {
        if (quant_of_blocks == 0)
            break;
        switch(Menu(Data_table[*selected_N_block]))
        {
        case 1:
            {
                Data_table.push_back(create_new_data_block());
                (*quant_of_blocks)++;
                break;
            }
        case 2:
            {
                if ((*selected_N_block < 0)||(*selected_N_block >= *quant_of_blocks))
                    cout << "Nie wybrano zadnego bloku danych" << endl;
                else
                {
                    system("pause");
                    Data_table[*selected_N_block]->save_to_file(file);
                }
                break;
            }
        case 3:
            {
                cout << "Wybierz numer bloku danych : ";
                int buffer ;
                cin >> buffer;
                if (( (buffer) >= 1 ) & ( (buffer) <= *quant_of_blocks))
                {
                    *selected_N_block = buffer - 1;
                }
                else
                {
                    cout << "Nie ma bloku o takim numerze" << endl;
                    system("pause");
                }
                break;
            }
        case 4:
            {
                show_all_data(Data_table,*quant_of_blocks);
                break;
            }
        default :
            {
                cout << "Brak takiego polecenia" << endl;
                system("pause");
                break;
            }
        }
    }
}


/// main.cpp 

#include "insert_data.h"
#include "menu_details.h"

using namespace std;

int main()
{
    fstream file;
    file.open("data.bin",ios::in | ios::out | ios::binary);

    int quant_of_blocks = 0;
    int selected_N_block = 0;
    Data *selected_block = NULL;


    if (file.is_open())
        cout << "Otworzono plik!" << endl;
    else
    {
        cout << "Nie udalo sie otworzyc pliku, wychodze z programu" << endl;
        return 0;
    }
    vector<Data*> Data_table;

for (int i = 0 ;i < 2; i++)
{
    if (selected_block != NULL)
        menu_loop(Data_table,&selected_N_block,&quant_of_blocks,file);
    else
    {
        char decision;
        cout << "Nie stworzono zadnego bloku danych, opcje menu sa niedostepne" << endl;
        cout << "Stworzyc pierwszy blok danych?(y -tak, inny znak - nie)" << endl;
        cin >> decision;
        if ((decision == 'y')||(decision == 'Y'))
        {
            Data_table.push_back(create_new_data_block());
            quant_of_blocks = 1;
            selected_block = Data_table[0];
        }
        else
        {
            cout << "Wychodze z programu" << endl;
        }
    }
}


    file.close();
    return 0;
}

 

komentarz 8 lipca 2019 przez DamianW Bywalec (2,080 p.)
Dodatkowo sprawdziłem, czy wszystkie zmienne są zainicjalizowane. Każda zmienna ma przypisaną wartość oraz miejsce w pamięci.
komentarz 8 lipca 2019 przez j23 Mędrzec (194,920 p.)

Tak nawiasem. Po co zrobiłeś pola Data::length_name i Data::length_club, skoro te informacje zawierają obiekty Data::name i Data::club?

Jeśli otwierasz strumień tylko do zapisu, używaj std::ofstream.

komentarz 8 lipca 2019 przez DamianW Bywalec (2,080 p.)
Zrobiłem te pola po to ,gdyż potem będę odczytywał dane z tego pliku i potrzebna mi jest ilość bajtów do odczytania .
komentarz 8 lipca 2019 przez j23 Mędrzec (194,920 p.)

Przecież długość tych łańcuchów też zapisujesz w pliku, tyle że źle to robisz, bo powinieneś najpierw zapisać długość tekstu, a potem sam tekst.

/* zapis */
size_t n = club.size();
file.write(reinterpret_cast<char*>(&n), sizeof(n));
file.write(club.c_str(), n);


/* odczyt */
size_t n;
char buf[256];

file.read(reinterpret_cast<char*>(&n), sizeof(n));

while (n > 0 && file.read(buf, std::min(n, 256))) {
    club.append(buf, buf + file.gcount());
    n -= file.gcount();
}

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 170 wizyt
0 głosów
1 odpowiedź 309 wizyt

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 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!

...