(прошу прощения, если это глупый вопрос; я действительно новичок в этом и пока не имею большого опыта работы с бинарными файлами)
Я пытаюсь создать своего рода программу для рисования 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
Когда я удаляю линии, которые добавляют новые формы к вектору, он ничего не помещает в вектор и не отображает вообще; Мне нужно выяснить, как добавить то, что уже было в файле в дополнение к новым фигурам.