从数据文件到多维矢量问题

时间:2015-01-30 03:17:47

标签: c++

我正在尝试写一个"文本冒险"运行文本和数据文件的引擎。我理解数组和多维数组的概念,但知道它们会导致内存泄漏而不是重新调整大小。因此,我决定使用矢量(或多维矢量)的矢量和矢量。我有一个数据文件,当前时间保持52行,每行有10个由空格分隔的整数。 (对于这个板)我将数据文件减少到3行。我很难将数据读入多维矢量。我的问题是我做错了什么?提前感谢您的任何见解。

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;



int main()
{
vector<vector <int> > rooms;
vector <int> locations;

ifstream openfile("rooms.dat");
 if (openfile.is_open()){
    while (!openfile.eof()){
            int temproom; openfile >> temproom;
    locations.push_back(temproom);
    }

    rooms.push_back(locations);
    locations.clear();
}
    for (int y=0;y<3;y++){
            for ( int i=0; i<9; i++){
                cout << rooms [y][ i ] << " , " ;
                }
                cout << rooms[y][9] << "\n" << endl;
                }

    return 0;
}

我有一个看起来像这样的数据文件:

23,6,4,8,2,12,6,3,2,6
65,34,22,65,34,23,11,5,3,3
3,12,21,4,9,5,2,7,43,22

1 个答案:

答案 0 :(得分:0)

让我带你了解我将如何做到这一点。

请注意,我根本没有尝试优化任何内容。编写易于理解的代码比优化更重要。此外,目前的编译器非常擅长优化此代码(使用NRVO)。

首先是涉及类型的一些typedef。它使得阅读和编写代码变得更加容易:

typedef std::vector<int> Locations;
struct Room
{
  Locations locations; // Apparently, a room has only locations (or should that be exits?) and nothing else.
};
typedef std::vector<Room> Rooms;

然后是一些高级别的代码:

Open File
Read File into 'rooms'
Print 'rooms'

在这种情况下,很容易转换为短主语:

int main()
{
    std::ifstream openfile("rooms.dat");
    Rooms rooms = readRooms(openfile);
    printRooms(rooms);

    return EXIT_SUCCESS;
}

如何实施readRooms()?我们再次从伪代码开始:

For each line in the file:
    Read the room on this line

逐行处理文件的最简单方法是使用std :: getline()读取整行。否则可能会意外地跳过换行符。为了便于解析这一行,让我们从中创建一个字符串流,这样我们就可以使用通常的方法来解析这一行。

请注意readRooms()接受std::istream,它比std::ifstream更通用。执行此操作时,该功能可用于例如std :: stringstream也是。

Rooms readRooms(std::istream& is)
{
    Rooms allRooms;
    std::string line;
    while (std::getline(is, line))
    {
       std::stringstream lineStream(line)
       Room newRoom = readRoom(lineStream);
       allRooms.push_back(newRoom);
    }
    return allRooms;
}

现在正在读一个房间。伪代码:

for each location on the line:
    add the location to the room

在代码中:

Room readRoom(std::istream& is)
{
     Room newRoom;
     int location;
     while (is >> location)
     {
         newRoom.Locations.push_back(location);

         // It would be easier if the locations are separated by whitespace only.
         char shouldBeComma;
         is >> std::ws >> shouldBeComma;
     }
     return newRoom;
}
哇,我们已经读完房间了!


您应该能够编写代码来自行打印房间。如果你有C ++ 11,那将非常简单:

void printRooms(const Rooms& rooms)
{
    for (const Room& room : rooms)
    {
        printRoom(room);
    }
}

依旧......