从文件创建二维矢量
Creating a two-dimensional vector from a file?
我正在尝试从网格中读取数据,在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;
}
然而,当我运行这段代码时,程序只输出一些空行。为什么这段代码不能工作?逻辑似乎很合理。
您可以按照Kocik所说的做,或者您可以在代码中使用 vector::reserve
而不是vector::resize
。它应该可以工作。
reserve
只是保留足够的内存,以避免在推回项时重新分配内存。resize
实际上通过添加n默认项来调整向量的大小。在你的例子中,这些项是字符串的空向量,所以在你随后推回的任何其他项之前,你将在你的向量中得到20个这样的项。
下面是关于这两种方法区别的更多信息
在使用grid[i].resize(WIDTH);
创建了20个元素之后使用grid[i].push_back(line);
。push_back方法在vector的末尾添加新元素,因此新元素的索引为21,22 ..40 .
你有两个选择:
- 你可以用一些迭代器为初始化的元素设置新值,或者
- 你可以跳过调整大小并将新元素推入空向量。只需删除这两行:
for (int i = 0; i < HEIGHT; i++) grid[i].resize(WIDTH);</li>
顺便说一句,使用向量的向量通常被认为是不好的做法。相反,使用包装单个向量并进行索引运算的类(x*h+y或y*w+x取决于您想要的主要顺序)。
相关文章:
- 将值从二维数组输出到文本文件
- C2440 使用Shared_ptr创建二维阵列
- 创建 std::string 的二维数组的最佳做法
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 在创建动态二维数组时,在A[i*c+j]中使用c有什么用,即c代表什么
- 如何在C++中将.csv文件的元素存储到二维向量中?
- C++ 如何从文本文件中扫描二维数组并对行求和?
- 有效地从文本文件中读取带有字符串索引的大型二维数组(矩阵)
- 如何将字符从文件放入二维矢量中
- C++ 将二维数据库保存到文件ISSUE中
- 读取.txt文件并组织成二维数组
- 从函数中的dat文件创建一个2维数组
- 如何在头文件中的类中声明二维数组
- 从二维整数数组中的文件中读取
- 创建二维动态数组的函数
- 从文件中读取的二维数组作为参数
- 如何在C++中创建二维数组的数组
- 从文本文件读取到表示一个月的二维数组中
- 如何创建一个具有空值、递减编号系统和.txt文件输入值的二维阵列网格
- 从文件创建二维矢量