Чтение / запись данных формы (графики) в двоичный файл и из него - PullRequest
1 голос
/ 05 апреля 2019

(прошу прощения, если это глупый вопрос; я действительно новичок в этом и пока не имею большого опыта работы с бинарными файлами)

Я пытаюсь создать своего рода программу для рисования MS для бедняков, в которой вы можете рисовать фигуры с помощью мыши, менять цвета, рисовать кистью и т. Д. Мне нужно иметь возможность сохранять прогресс пользователя в двоичном файле (требования к домашней работе) с помощью структуры.

Я думаю, что мне удалось сохранить данные успешно (?), Но я, кажется, не могу извлечь их снова - или, по крайней мере, у меня возникают проблемы с выяснением, как проверить, есть или нет уже что-нибудь в файле. Независимо от того, как я это пишу, компилятору не интересно читать его.

Честно говоря, возможно, я только что запутался с указателями

Если я избавляюсь от «while» перед « inFile.read (reinterpret_cast (& temp), sizeof (ShapeData)) * », чтобы заставить его читать из файла, он просто (не слишком удивительно) возвращает мусор.

Я выписал его версию для «баг-теста» (избавления от несвязанных функций), чтобы попытаться как можно больше изолировать проблему, но я занимался этим часами и мог реально использовать совет того, кто на самом деле полностью знает, что они делают. :)

#include <iostream>
#include <fstream>
using namespace std;
#include <SFML\Graphics.hpp>
using namespace sf;

enum ShapeEnum { CIRCLE, SQUARE };

struct ShapeData
{
    ShapeEnum shapeType;
    int shapeLocationX,
    shapeLocationY,     // location x and y originally vector2f;
    shapeColor;         // had more luck with changing to ints for file
                        // (shape color also converted from .tointeger())
};

int main()
{

  int amountFilled = 0;
  ShapeData temp;

  vector<ShapeData*> shapes;

  ofstream oFile;
  oFile.open("shapes.bin", ios::out | ios::binary);
  ifstream inFile;
  inFile.open("shapes.bin", ios::in | ios::binary);

  if (!inFile)
    {
       cout << "file Open Failure" << endl;
       EXIT_FAILURE;
    }

  while (inFile.read(reinterpret_cast<char*>(&temp), sizeof(ShapeData)))
  {
     shapes.push_back(new ShapeData(temp));
     amountFilled++;
  }

     // test input
        temp.shapeColor = Color::Blue.toInteger();
        temp.shapeLocationX = 200;
        temp.shapeLocationY = 400;
        temp.shapeType = CIRCLE;
        shapes.push_back(new ShapeData(temp));
        amountFilled++;
     // test input
        temp.shapeColor = Color::Red.toInteger();
        temp.shapeLocationX = 25;
        temp.shapeLocationY = 650;
        temp.shapeType = SQUARE;
        shapes.push_back(new ShapeData(temp));
        amountFilled++; 

  for (int i = 0; i < amountFilled; i++) // test display
  {
     cout << "Color # : " << shapes[i]->shapeColor << "; " 
     << "Location : ( " 
         << shapes[i]->shapeLocationX << ", " << shapes[i]->shapeLocationY 
         << " ); " 
     << "Enum # : " << shapes[i]->shapeType << endl;

     oFile.write(reinterpret_cast<char*>(&shapes[i]), sizeof(ShapeData));
  }

        oFile.close();
        inFile.close();

    return 0;
}

так, как написано в данный момент, вывод выглядит так:

Цвет №: 65535; Расположение: (200, 400); Enum #: 0

Цвет #: -16776961; Расположение: (25, 650); Enum #: 1

Когда я удаляю линии, которые добавляют новые формы к вектору, он ничего не помещает в вектор и не отображает вообще; Мне нужно выяснить, как добавить то, что уже было в файле в дополнение к новым фигурам.

...