我正在尝试从20x20文件中的网格中读取数据。我正在使用字符串向量的二维向量。
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
using namespace std;
#define HEIGHT 20
#define WIDTH 20
typedef vector<vector<string> > stringGrid;
bool readGrid(stringGrid& grid, string filename) {
grid.resize(HEIGHT);
for (int i = 0; i < HEIGHT; i++)
grid[i].resize(WIDTH);
ifstream file;
string line;
file.open(filename.c_str());
if (!file.is_open()) {
return false;
}
for (int i = 0; i < HEIGHT; i++)
{
while (getline(file, line)) {
grid[i].push_back(line);
}
}
return true;
}
void displayGrid(stringGrid grid)
{
for (int row = 0; row < HEIGHT; row++)
{
for (int col = 0; col < WIDTH; col++)
{
cout << grid[col][row];
}
cout << endl;
}
}
int main(){
stringGrid grid;
readGrid(grid, "test.txt");
displayGrid(grid);
return 0;
}
但是,当我运行此代码时,程序只输出一些空白行。 为什么这段代码不起作用?逻辑似乎听起来不够。
答案 0 :(得分:3)
您可以执行Kocik所说的内容,也可以在代码中使用 vector::reserve
代替vector::resize
。它应该可以工作。
reserve
只需保留足够的内存,以避免在推回内存时重新分配内存。
resize
实际上通过添加 n 默认项来调整向量的大小。在您的情况下,这些项目是字符串的空向量,因此您可以在向后推送任何其他项目之前在向量中获取其中的20个。
Here是关于两种方法之间差异的更多信息。
答案 1 :(得分:0)
使用grid[i].push_back(line);
创建20个元素后,使用grid[i].resize(WIDTH);
。方法push_back在向量的末尾添加新元素,因此新元素将具有索引21,22 .. 40。
您有两种选择:
for (int i = 0; i < HEIGHT; i++) grid[i].resize(WIDTH);</li>
答案 2 :(得分:0)
顺便说一下,使用矢量矢量通常被认为是不好的做法。相反,使用包含单个向量的类并进行索引算术(x * h + y或y * w + x,具体取决于您想要的主要顺序)。