文件存储和检索

时间:2013-06-13 22:15:24

标签: c++ arrays istream ostream

我是一名高中生编程作为一种爱好。我制作免费的东西,我正在使用opengl进行游戏。我需要保存和加载数据,但遇到困难时,我做了以下测试我的方法。

保存文件'shiptest'是正确的但是当我打开第二个文件'shipout'时,它是使用'shiptest'中的保存数据创建的,只有第一行存在。起初我以为我的数组没有加载任何新数据,并且clear函数没有摆脱第一个元素。我通过在保存数据后覆盖这些行并观察到保存的行被加载后更正了这个假设。我的新假设是getline func只在每次调用时获得第一行;但我不知道如何解决这个问题。

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>

unsigned short int shipPart;

float editShip[256][3];//part ID, x relative, y relative, r,g,b
float activeShip[256][3];

void CLEAR(bool edit)
{
    for (int n = 0; n < 256; n++)
    {
        if (edit)
            editShip[n][0] = -1;
        else
            activeShip[n][0] = -1;
    }
}

void saveEdit(std::string name)
{
    std::ofstream out;
    out.open ("ship" + name + ".txt", std::ofstream::out);

    for (int n = 0; n < 256; n++)
    {
        for (int i = 0; i < 3; i++)
        {
            if (editShip[n][0] == -1)
                break;
            out << editShip[n][i] << " ";
        }
        out << "\n";
    }

    out.close();
}

void load(std::string name, bool edit)
{
    CLEAR(edit);
    std::ifstream in;
    in.open ("ship" + name + ".txt", std::ifstream::in);
    std::string line, buf;
    std::stringstream ss;
    int i;
    for (int n = 0; n < 3; n++)
    {
        getline(in, line);
        ss << line;
        i=0;
        while (ss >> buf)
        {
            if (edit)
                editShip[n][i] = atof(buf.c_str());
            else
                activeShip[n][i] = atof(buf.c_str());
            i++;
        }
    }
    in.close();
}

int main()
{
    for (int n = 0; n < 256; n++)
    {
        editShip[n][0] = -1;
        activeShip[n][0] = -1;
    }

    editShip[0][0] = 5;
    editShip[0][1] = .11;
    editShip[0][2] = .22;
    editShip[1][0] = 4;
    editShip[1][1] = .33;
    editShip[1][2] = .44;
    editShip[2][0] = 3;
    editShip[2][1] = .55;
    editShip[2][2] = .66;

    saveEdit("test");

    editShip[0][0] = 5000;
    editShip[0][1] = 8978;
    editShip[0][2] = 8888;

    load("test",1);

    saveEdit("out");

    std::cout << "Hello world!" << std::endl;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

load()中,你不断向stringstream ss添加更多行,但是它的eof标志可能是从前一次循环开始设置的,所以即使还有更多内容可以读取,eof是已设置,因此不会继续通过operator>>()提供数据。如果您只是在ss.clear()循环顶部调用for(),则每个循环都会以空stringstream开头,我认为您会得到您想要的内容。

答案 1 :(得分:1)

load()函数中:

for (int n = 0; n < 3; n++)
{
    ss.clear(); //< Clear ss here before you use it!
    getline(in, line);
    ss << line;
    i=0;
    while (ss >> buf)
    {
        if (edit)
            editShip[n][i] = atof(buf.c_str());
        else
            activeShip[n][i] = atof(buf.c_str());
        i++;
    }
}

Getline()工作正常。在使用之前清除字符串流,你就可以了。将此代码保存在我的计算机上,它可以根据需要运行。

编辑:Ack!刚看到phonetagger在我回答时说了同样的话。他应该得+ 1不是我。