动态分配的数组在输出时丢失 ifstream 数据
Dynamically allocated array losing ifstream data upon ouput
我正在处理一个代码,该代码读取包含赛道"路线"的文件,并且需要首先确定赛道的高度和宽度。示例课程如下所示:
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()
每一行,直到到达文件末尾。
当一切都说完了,矢量的大小就是地图的高度。 因为向量包含文件中每一行的一个值。通过查看每条线的大小,您就会知道地图的宽度。
就是这样。也许有十几行代码,仅此而已。比你在这里展示的更简单,更容易理解。您现有的逻辑(获取文件大小,获取第一行的大小,然后逐行除以另一行)非常脆弱。如果由于某种原因,文件中的行具有不同的长度(也许其中一些行有一些尾随空格),则计算结果将完全关闭。有了这种更简单的方法,处理这种错误情况变得更加容易,并且仍然可以得出一些有意义的结果。
- 使用ifstream时,被调用文件中的数据不会打印
- 从带有 std::ifstream::read() 的文件中读取 int 遍历 char * 二进制数据
- 尝试使用 ifstream 读取数据后显示不正确的数字
- std::ifstream 数据类型?
- C++ ifstream 错误:无法读取数据
- 需要根据读取的数据类型将ifstream提取到单独的数组中
- 使用ifstream从DAT文件加载数据
- ifstream不使用C 中的数组检索数据
- 动态分配的数组在输出时丢失 ifstream 数据
- 使用 ifstream 将二进制数据读入结构
- 如何使用ifstream正确读取输入文件中的数据
- 使用ifstream使用getline缺少数据行
- Ifstream 读取无用的数据
- 为什么ifstream在读取混合数据时失败
- 尝试将数据保存到数组中时出现ifstream运行时错误
- 在使用 ofstream 将数据写入其文件后更新 ifstream 对象
- 使用 ifstream 从文件中读取数据并将其存储在数组中
- c++ ifstream 跳过数据
- 如何从 ifstream 检索数据
- ifstream Read 和 Fread 不返回相同的数据,C++