在二进制文件中读取/写入形状(图形)数据

时间:2019-04-05 05:04:22

标签: c++ visual-c++ fstream binaryfiles

(我很抱歉这是一个愚蠢的问题;我真的很陌生,对二进制文件还没有太多经验)

我正在尝试创建一种穷人的MS绘画程序,您可以在其中使用鼠标绘制形状,更改颜色,画笔等。我需要能够通过结构将用户的进度保存到二进制文件(作业要求)中。

我认为我已经成功保存了数据(?),但是似乎无法再次将其提取出来-至少,我在弄清楚如何检查是否存在数据时遇到了麻烦文件中已包含任何内容。不管我怎么写,编译器似乎都没有兴趣读它。

<罢工> 老实说,我可能只是被指针弄弄了

如果我放弃了“ inFile.read(reinterpret_cast(&temp),sizeof(ShapeData))”前面的“ while”以强制其从文件中读取,只是(并不十分令人惊讶)会返回垃圾。

我已经写出了它的“错误测试”版本(摆脱了不相关的功能),试图尽我所能来隔离问题,但是我已经花了好几个小时了,真的可以使用实际上完全知道自己在做什么的人的建议。 :)

#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);枚举#:0

颜色#:-16776961;位置:(25,650);枚举#:1

当我删除在矢量中添加新形状的线条时,它什么也没有放入矢量中或根本不显示;除了新形状之外,我还需要弄清楚如何添加文件中已经存在的内容。

0 个答案:

没有答案