动态分配的数组在输出时丢失 ifstream 数据

Dynamically allocated array losing ifstream data upon ouput

本文关键字:ifstream 数据 输出 数组 动态分配      更新时间:2023-10-16

我正在处理一个代码,该代码读取包含赛道"路线"的文件,并且需要首先确定赛道的高度和宽度。示例课程如下所示:

xxxxXxxxxXxxxxXxxxxXxxxxXxxxxX
xxxxxx      xxxxx      xxx  xx
xxxxx        xxx       xx    x
xx     xx     x        x     x
X      xx              x  x  x
x      xx                 x  x
x      xxxxxxxxxxxxxx     x  x
x     xxxxxxxxxxxxxxxxxxxxx  x
xFFFF x  xxxxxxxxxxxxxx      x
XFFFF x    xxxxxxxx          x
x     x      1               x
xxxxxxx      2        xxx    x
xxxxxx       3         x     x
x                            x
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

现在,由于数组在编译时需要常量值,而我无法提供,因此我尝试在检索高度和宽度值后将数组动态分配给内存。总之,我的代码看起来像这样:

#include <iostream>
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
struct Level {
int HEIGHT;
int WIDTH;
};
vector<Level> getRowCol(istream& fin) {
vector<Level> level;
fin.seekg(0, fin.end);
int fileSize = fin.tellg();
fin.seekg(0, fin.beg);
string s;
if (getline(fin, s)) {
Level l;
l.WIDTH = s.size();
l.HEIGHT = fileSize / (l.WIDTH + 1);
level.push_back(l);
}
return level;
}
void readCourse(int& cols, int& rows, istream& fin) {
char** level = new char*[rows];
for (int i = 0; i < cols; i++) {
level[i] = new char[cols];
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
level[i][j] = 0;
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
fin.get(level[i][j]);
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << level[i][j];
}
}
}

int main(int argc, char** argv) {
vector<Level> course;
ifstream fin(argv[1]);
course = getRowCol(fin);
cout << course[0].WIDTH << " columns" << endl;
cout << course[0].HEIGHT << " rows" << endl;
readCourse(course[0].WIDTH, course[0].HEIGHT, fin);
return 0;
}

通过命令行传递文件时,此代码的输出如下所示:

31 columns
14 rows
xxxxxx      xxxxx      xxx  xx
xxxxx        xxx       xx    x
xx     xx     x        x     x
X      xx              x  x  x
x      xx                 x  x
x      xxxxxxxxxxxxxx     x  x
x     xxxxxxxxxxxxxxxxxxxxx  x
xFFFF x  xxxxxxxxxxxxxx      x
XFFFF x    xxxxxxxx          x
x     x      1               x
xxxxxxx      2        xxx    x
xxxxxx       3         x     x
x                            x
Xxxxxxxxxxxxxxxxxx

现在看来存在差距。如果在编译之前声明const int值,则不会出现这些间隙。但是,我想不出另一种方法可以使用未知值构建数组,直到脚本无法使用动态分配。

有没有另一种或更好的方法来实现这一目标?

您的第一个业务顺序是调用getRowCol(),它以一种相当迂回的方式尝试提前确定文件中地图的大小。它通过确定文件的大小,然后倒回文件的开头,读取第一行,获取其长度,然后计算行数来实现此目的。

但是,如果您非常仔细地注意,您会意识到当getRowCol()返回时,它会在阅读文件的第一行执行此操作。但下面的代码假定它从文件的开头读取,并读取整个映射。当然,这不会再发生,因为文件中的第一行已被读取。

这解释了您问题的第一部分,缺少一行和一个空格。

至于你问题的第二部分:所有这些复杂的逻辑都是绝对的、完全的、完全没有必要的。

您的代码表明您具有对向量工作原理的基本知识和理解。

那么,为什么首先需要这种复杂的逻辑呢?

只需打开文件,将文件的每一行读入向量,读取后push_back()每一行,直到到达文件末尾。

当一切都说完了,矢量的大小就是地图的高度。 因为向量包含文件中每一行的一个值。通过查看每条线的大小,您就会知道地图的宽度。

就是这样。也许有十几行代码,仅此而已。比你在这里展示的更简单,更容易理解。您现有的逻辑(获取文件大小,获取第一行的大小,然后逐行除以另一行)非常脆弱。如果由于某种原因,文件中的行具有不同的长度(也许其中一些行有一些尾随空格),则计算结果将完全关闭。有了这种更简单的方法,处理这种错误情况变得更加容易,并且仍然可以得出一些有意义的结果。