Ошибка при записи в файл ООП

Рейтинг: -2Ответов: 1Опубликовано: 01.08.2023

Недавно начал изучать программирование и столкнулся с проблемой. Можете объяснить, почему файл не открывается? И еще один вопрос, как вернуть данные объекта, записанные в файл так, что бы он смог с ними дальше работать? Спасибо.

    #include <fstream>
    #include <Windows.h>
    #include <iostream>
    #include <conio.h>
    using namespace std;
    class Player
    {
    public:
        int x, y;
    public:
        Player()
        {
            x = 0;
            y = 0;
        }
        friend class LoadFile;
        friend void input(Player &player, LoadFile& loadFile);
        void print()
        {
            cout << "x: " << x << "\ty:" << y << '\n';  
        }
    };
    class LoadFile
    {
    private:
        fstream fs;
        string nameFile;
    public: 
        void Save(Player &player)
        {
            //cin >> nameFile;
            nameFile = "newFile.txt";
            fs.open(nameFile, fstream::in | fstream::out);
            if (!fs.is_open())
            {
                cout << "Файл не удалось открыть" << "\n";
                system("pause");
            }
            else
            {
                fs.write((char*)&player, sizeof(Player));
            }
            fs.close();
        }
        void LoadSave(Player &player)
        {
            fs.open(nameFile, fstream::in | fstream::out);
            if (!fs.is_open())
            {
                cout << "Файл не удалось прочесть" << "\n";
                system("pause");
            }
            else
            {
                Player pl;
                while (fs.read((char*)&pl, sizeof(Player)))
                {
                    player = pl;
                }
            }
        }
    };
    void input(Player &player, LoadFile &loadFile)
    {
        while (_kbhit())
        {
            switch (_getch())
            {
            case 'w': 
                player.y--;
                break;
            case 'd': 
                player.x++;
                break;
            case 'a':
                player.x--; 
                break;
            case 's': 
                player.y++;
                break;
            case 'x':
                loadFile.Save(player);
                break;
            case 'r':
                loadFile.LoadSave(player);
                break;
            }
        }
    }
    int main()
    {
        setlocale(LC_ALL, "");
        system("chcp 1251 > 0");
        Player player;
        LoadFile loadFile;
        while (true)
        {
            system("cls");
    
            input(player, loadFile);
            player.print();
            
            Sleep(300);
        }
    }

Ответы

▲ 1

Не уверен что правильно назову все термины, так что поправьте если что. Ошибка была при открытия файла при помощи класса fstream, он открывал класс только с флагом fstream::app, но это записывало поверх данных доп.информацию, поэтому в функции Save я заменил fstream на ofstream, а в функции LoadSave на ifstream.

Возврат данных вместо:

Player pl;
while (fs.read((char*)&pl, sizeof(Player)))
{
    player = pl;
}

На

while(fs.read((char*)&player, sizeof(Player)))
{
    return player;
}

а тип возвращаемых данных вместо

void LoadSave(){}

заменил на

Player LoadSave(){}