我正在尝试写一个"文本冒险"运行文本和数据文件的引擎。我理解数组和多维数组的概念,但知道它们会导致内存泄漏而不是重新调整大小。因此,我决定使用矢量(或多维矢量)的矢量和矢量。我有一个数据文件,当前时间保持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
答案 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);
}
}
依旧......